Haskell имеет две функции левой складки для списков: foldl
и "строгая" версия, foldl'
. Проблема с нестрогим foldl
заключается в том, что он строит башню громкости:
foldl (+) 0 [1..5]
--> ((((0 + 1) + 2) + 3) + 4) + 5
--> 15
Это отнимает память и может вызвать переполнение стека, если в списке слишком много элементов. foldl'
, с другой стороны, заставляет аккумулятор на каждом элементе.
Однако, насколько я могу судить, foldl'
семантически эквивалентен foldl
. Оценка foldl (+) 0 [1..5]
, чтобы гладить нормальную форму, требует принудительного включения аккумулятора в какой-то момент. Если бы нам не нужна форма головы, мы не будем оценивать foldl (+) 0 [1..5]
для начала.
Есть ли какая-то веская причина, по которой поведение foldl
было бы по сравнению с foldl'
?