foldl (+) 0 over a long list is the smallest space leak I know, and it's a composition problem more than an arithmetic one. Each step builds a thunk (acc + x) that nobody forces until the end, so the accumulator grows into a chain as long as the list. foldl' from Data.List forces the accumulator to weak head normal form at every step, and the chain never forms.
The trap is that both versions have the same type. Nothing in foldl :: Foldable t => (b -> a -> b) -> b -> t a -> b says how much memory the result holds before it is demanded. Wrap the fold in a nicer combinator and the strictness decision gets buried one level deeper, where a reader can't see it.
With optimization on, GHC's strictness analysis often rescues the plain foldl anyway. That's exactly why it catches people off guard in GHCi.
Worse, foldl' only goes to WHNF. Accumulate a pair (sum, count) and the pair constructor is evaluated while both fields stay lazy. You need strict fields or bang patterns on the components.
So I've stopped treating strictness as an optimization detail. For a combinator that folds, it belongs in the name or the docs, right next to the type.