Как foldl lazy?

Есть много хороших вопросов и ответов о 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.
Однако я все еще ищу пример, в котором более активная оценка функции комбинирования привела бы к другому результату (либо к сбою, либо к ненужной оценке).

12
задан Community 23 May 2017 в 12:14
поделиться