В 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'
?