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.