Форум
Философия программирования
Тема
Как правильно задавать вопросы
B
I
abc
U
X
3
X
3
H1
H2
H3
H4
H5
H6
Asm
C/C++
C#
Erlang
Haskell
IDL
Java
Lisp
MSIL
Nemerle
ObjC
OCaml
Pascal
Perl
PHP
Prolog
Python
Ruby
Rust
SQL
VB
Здравствуйте, Klapaucius, Вы писали: K>Здравствуйте, Evgeny.Panasyuk, Вы писали: EP>>Никакого монадического кода там не было, если конечно не считать тривиальную монаду. K>там не Identity, а Continuation монада (наскольк вообще можно говоритьо монадах в бестиповом языке). EP>>Там не обработка пустого значения - а возвращение (причём возвращать пустое значение не обязательно). Это просто void. Я добавил if чтобы продемонстрировать что это именно монада, а не АФ. K>Да про if-то понятно, дело в (). Ну, представьте, что это на типизированном языке написано - какой у нее возвращаемый тип? EP>>Подробнее. В примере Scheme - никакой ленивости нет, но раннее завершение у maybe - есть. K>Я на этот вопрос отвечаю прямо в посте на который вы отвечаете. EP>>Приведите тогда пример немонадического кода на Scheme. K>Затрудняюсь. Я вообще не составил для себя твердого представления, что можно считать (не)монадическим кодом в бестиповых языках. (В принципе, о монадах в языках без * -> * кайндов мы говорим, может и тут что-то можно придумать). EP>>Ленивость позволяет не вычислять ненужное в тех случаях, когда функция/алгоритм описаны с ненужными вычислениями. K>Ну, вроде бы причина понятна, когда мы комбинируем функции, то часто описываем как раз такой вот код с ненужными вычислениями. И пока мы вычисляем что-то лишнее по сравнению с сфьюженой вручную версией - подход "комбинирование комбинаторов" всегда будет ущербным по сравнению с подходом "пишем рекурсивную лапшу". А это полноценному ФП сильно не способствует. EP>>Какое-то засилье ненужных вычислений в ФП, из-за которого ленивость необходима как пища, продемонстрировано не было. K>Довольно странно сейчас спрашивать подтверждение тому, что вы сами же и заметили и разговор о чем начали K>[url=http://rsdn.ru/forum/philosophy/5428266.1]здесь[/url]. K>[q]foldl (+) 0 a (обсуждаемый выше) для [Maybe a] будет неэффективным[/q] EP>>Более того, судя по Q&A на stackoverflow, когда нужна скорость - от этой ленивости бегут, точно также как и от GC. K>Это, мягко говоря, сильное упрощение проблемы. Во многих случаях как раз ленивость и GC скорость и обеспечивают. Особенно это касается именно высокоуровневого и идиоматичного кода. EP>>Непрактичность ленивости? Комбинирование обязательно влечёт за собой ленивость? K>С.м. выше начиная с "Ну, вроде бы причина понятна, когда мы комбинируем функции, то часто..." EP>>Мы же вроде обсуждали монадический код? K>Вы же сами перешли на тему обеспечения производительности "комбинаторного" кода. Но темы, конечно, пересекающиеся. EP>>С этим я не спорю. Я просто показал, как в языках с call/cc обычный код легко превращается в монадичный. K>Это скорее демонстрация того, что монада Cont[inuation] может служить функциональной заменой для многих монад. K>Проблема превращения "обычного" кода в монадический, вообще принципиально сложная. Без указания мест где нужны >>= это не сделать. Вашем коде они вручную помечены. Вот сделать из монадического обычный гораздо проще - для этого Identity монады достаточно.
Теги:
Введите теги разделенные пробелами. Обрамляйте в кавычки словосочетания с пробелами внутри, например:
"Visual Studio" .NET
Имя, пароль:
Загрузить
Нравится наш сайт?
Помогите его развитию!
Отключить смайлики
Получать ответы по e-mail
Проверить правописание
Параметры проверки …