singalen: (Default)
[personal profile] singalen
Рассматриваю чудесный баг с функциональным стилем и ленивыми вычислениями, но в присутствии сайд-эффектов.

Передаётся в функцию лениво-вычисляемая коллекция "where", скажем, зайцев. В коллекции записано, каких зайцев, допустим, нарисовать.
Функция их рисует и взводит каждому флажок "нарисован".
Естественно, изначально в условии where стоит "не нарисован".

А потом нужно, скажем, освежить их в кэше. Вот мы и проходимся ещё раз по коллекции - и оппа! Правильно, она пустая, зайцев нет, кэш не обновляется. Или ещё хуже - зайцы с флажками, взведёнными из другого потока.
И под дебаггером она, гадость, не смотрится, потому что yield return не вычислен.

Вот вам и функциональный стиль в императивных языках.
Tags:

(no subject)

3/7/08 12:42 (UTC)
Posted by [identity profile] gabriel-irk.livejournal.com
На сам функциональный стиль ты зря наезжаешь.

Ленивые вычисления при наличии сайд-эффектов это то ещё самоубийство апстену. Даже без сайд-эффектов ленивость плохо дружит с многопоточностью.

Но к собственно ФП как парадигме это имеет мало отношения.

(no subject)

3/7/08 13:14 (UTC)
Posted by [identity profile] gabriel-irk.livejournal.com
Да, дополнение про императивные языки я как-то упустил...

Но, в любом случае, если ты из разных функций просматриваешь _одну и ту же_ коллекцию - это не ФП. В ФП нужно создавать новую и передавать её куда следует.

(no subject)

3/7/08 13:21 (UTC)
Posted by [identity profile] gabriel-irk.livejournal.com
Вот-вот. И её _значение_ не должно меняться. Т.е. если в коллекции были кролики исчезнуть они не могли.

(no subject)

3/7/08 13:30 (UTC)
Posted by [identity profile] gabriel-irk.livejournal.com
>Функция их рисует и взводит каждому флажок "нарисован".
Означает ли это "порождает новую коллекцию зайцев с флажками "нарисован"? Иначе это не ФП. *PARDON*

(no subject)

3/7/08 13:42 (UTC)
Posted by [identity profile] gabriel-irk.livejournal.com
>Рассматриваю чудесный баг с функциональным стилем и ленивыми вычислениями
Не говорил про ФП? ;)

(no subject)

3/7/08 14:04 (UTC)
Posted by [identity profile] gabriel-irk.livejournal.com
В том-то и дело, что ты написал не про функциональный стиль, а про конкретную технику - ленивые вычисления.

При этом использовал ты (или не ты?) их в НЕ функциональном стиле.

Конечно, ну его нахуй - использовать ленивые вычисления в императивном многопоточном коде! Лучше сразу апстену.

Тем не менее, можно их использовать с сайд эффектами и потоками, но только там где очень надо и только в функциональном стиле. Смотри, например, OCaml.