В Haskell есть много хороших вопросов и ответов о foldl
, foldr
и foldl'
.
Итак, теперь я знаю это:
1) foldl
- ленивый
2) не используйте foldl
, потому что он может взорвать стек
3) используйте foldl'
вместо этого, потому что это строго (ish)
Как оценивается foldl
:
1) создается целая куча тромбов
2) после того, как Haskell закончил создавать трюки, уменьшаются громкости
3) переполнение стека, если слишком много thunks
Что меня смущает:
1) почему происходит редукция после всех торможений?
2) почему не foldl
оценивается так же, как foldl'
? Это просто побочный эффект реализации?
3) из определения , foldl
выглядит так, что его можно эффективно оценить с помощью tail-recursion - как я могу определить, будет ли функция фактически быть эффективно оценены? Кажется, что я должен начать беспокоиться о порядке оценки в Haskell, если я не хочу, чтобы моя программа потерпела крах.
Спасибо заранее. Я не знаю, правильно ли я понимаю оценку foldl
. При необходимости предложите исправления.
UPDATE: похоже, что ответ на мой вопрос имеет отношение к Нормальной форме, Слабой нормальной форме и Head Normal Form, а также к реализации Haskell из них.
Тем не менее, я все еще ищу пример, где более высокая оценка функции объединения приведет к другому результату (либо к сбою, либо к ненужной оценке).