Я все еще ищу пример, где более быстрая оценка функции объединения привела бы к другому результату
Общее правило никогда не бывает, никогда не используйте foldl
.Всегда используйте foldl'
, , за исключением случаев, когда вы должны использовать foldr
. Я думаю, вы знаете достаточно о foldl
, чтобы понять, почему его следует избегать.
См. Также: Real World Haskell> Функциональное программирование # Левые сгибы, лень и утечки пространства
Однако, ваш вопрос пренебрегает foldr
.Отличная особенность foldr
в том, что он может давать инкрементальные результаты, в то время как foldl'
необходимо пройти по всему списку, прежде чем дать ответ.Это означает, что лень foldr
позволяет ему работать с бесконечными списками.Есть также вопросы и ответы, которые подробно описывают подобные вещи.
Подняв это, позвольте мне кратко ответить на ваши вопросы.
1) Почему сокращениедолжно произойти после всех бросков?
Сокращение только происходит в точках строгости.Например, выполнение ввода-вывода - это пункт строгости.foldl'
использует seq
, чтобы добавить дополнительный пункт строгости, которого нет у foldl
.
2) почему фолд не оценивается так же, как фолд '?Является ли это просто побочным эффектом реализации?
Из-за дополнительной точки строгости в foldl'
3) из определения, foldl выглядит как хвост-рекурсивныйфункция для меня - как я могу сказать, будет ли функция фактически оценена эффективно?Похоже, мне нужно начать беспокоиться о порядке оценки в Haskell, если я не хочу, чтобы моя программа аварийно завершала работу.
Вам нужно немного больше узнать о ленивой оценке.Ленивая оценка не является исключительной для Haskell, но Haskell является одним из очень и очень немногих языков, в которых лень используется по умолчанию.Для новичка просто не забывайте всегда использовать foldl'
, и с вами все будет в порядке.
Если лень действительно когда-нибудь доставит вам неприятности, то именно тогда вы, вероятно, должны убедиться, что понимаете лень и пункты строгости Хаскелла.Можно сказать, что указанный теоретический день является точкой строгости для ленивого обучения по умолчанию.
См. Также: PLAI> Часть III: Лень