Смешанная, блин, парадигма.
2/7/08 13:49Рассматриваю чудесный баг с функциональным стилем и ленивыми вычислениями, но в присутствии сайд-эффектов.
Передаётся в функцию лениво-вычисляемая коллекция "where", скажем, зайцев. В коллекции записано, каких зайцев, допустим, нарисовать.
Функция их рисует и взводит каждому флажок "нарисован".
Естественно, изначально в условии where стоит "не нарисован".
А потом нужно, скажем, освежить их в кэше. Вот мы и проходимся ещё раз по коллекции - и оппа! Правильно, она пустая, зайцев нет, кэш не обновляется. Или ещё хуже - зайцы с флажками, взведёнными из другого потока.
И под дебаггером она, гадость, не смотрится, потому что yield return не вычислен.
Вот вам и функциональный стиль в императивных языках.
Передаётся в функцию лениво-вычисляемая коллекция "where", скажем, зайцев. В коллекции записано, каких зайцев, допустим, нарисовать.
Функция их рисует и взводит каждому флажок "нарисован".
Естественно, изначально в условии where стоит "не нарисован".
А потом нужно, скажем, освежить их в кэше. Вот мы и проходимся ещё раз по коллекции - и оппа! Правильно, она пустая, зайцев нет, кэш не обновляется. Или ещё хуже - зайцы с флажками, взведёнными из другого потока.
И под дебаггером она, гадость, не смотрится, потому что yield return не вычислен.
Вот вам и функциональный стиль в императивных языках.
Tags:
(no subject)
3/7/08 12:42 (UTC)Ленивые вычисления при наличии сайд-эффектов это то ещё самоубийство апстену. Даже без сайд-эффектов ленивость плохо дружит с многопоточностью.
Но к собственно ФП как парадигме это имеет мало отношения.
(no subject)
3/7/08 12:43 (UTC)(no subject)
3/7/08 13:14 (UTC)Но, в любом случае, если ты из разных функций просматриваешь _одну и ту же_ коллекцию - это не ФП. В ФП нужно создавать новую и передавать её куда следует.
(no subject)
3/7/08 13:16 (UTC)(no subject)
3/7/08 13:21 (UTC)(no subject)
3/7/08 13:22 (UTC)(no subject)
3/7/08 13:30 (UTC)Означает ли это "порождает новую коллекцию зайцев с флажками "нарисован"? Иначе это не ФП. *PARDON*
(no subject)
3/7/08 13:31 (UTC)(no subject)
3/7/08 13:42 (UTC)Не говорил про ФП? ;)
(no subject)
3/7/08 13:43 (UTC)(no subject)
3/7/08 14:04 (UTC)При этом использовал ты (или не ты?) их в НЕ функциональном стиле.
Конечно, ну его нахуй - использовать ленивые вычисления в императивном многопоточном коде! Лучше сразу апстену.
Тем не менее, можно их использовать с сайд эффектами и потоками, но только там где очень надо и только в функциональном стиле. Смотри, например, OCaml.