Есть много хороших вопросов и ответов о foldl
, foldr
и foldl '
в Haskell.
Теперь я знаю, что:
1) foldl
ленивая
2) не используйте foldl
, потому что он может взорвать стек
3) вместо этого используйте foldl '
, потому что это строго ( ish )
Как foldl
оценивается:
1) создается целая группа преобразователей
2) после того, как Haskell завершает создание преобразователей, количество преобразователей уменьшается
3 ) переполняют стек, если слишком много преобразователей
Что меня смущает:
1) почему сокращение должно происходить после всех преобразований?
2) почему foldl
не оценивается так же, как foldl '
? Это просто побочный эффект реализации?
3) из определения , foldl
похоже, что его можно эффективно оценить с помощью хвостовой рекурсии - как могу ли я сказать, действительно ли функция будет эффективно оценена? Похоже, мне нужно начать беспокоиться о порядке оценки в Haskell, если я не хочу, чтобы моя программа вылетела из строя.
Заранее спасибо. Я не знаю, правильно ли я понимаю оценку foldl
- при необходимости предложите исправления.
ОБНОВЛЕНИЕ: похоже, ответ на мой вопрос имеет какое-то отношение к нормальной форме, слабой нормальной форме и нормальной форме головы, а также к их реализации в Haskell.
Однако я все еще ищу пример, в котором более активная оценка функции комбинирования привела бы к другому результату (либо к сбою, либо к ненужной оценке).