Haskell has two left fold functions for lists: foldl
, and a \"strict\" version, foldl\'
. The problem with the non-strict foldl
is that it
foldl
and foldl'
are not semantically equivalent. Trivial counterexample:
Prelude Data.List> foldl (\x y -> y) 0 [undefined, 1]
1
Prelude Data.List> foldl' (\x y -> y) 0 [undefined, 1]
*** Exception: Prelude.undefined
In practice, however, you usually want the strict foldl'
for the reasons you mentioned.