Lazy memory leaks
One of the main issues with laziness is that it becomes much harder to reason about the order in which different parts of the program are executed. That in itself is not necessarily a problem, but a side effect can be. When a program does not need the result of a computation immediately but may need it later, it holds onto that computation in the form of a thunk. Over time, a build-up of such thunks can arise, and the program may start using excessive amounts of memory for them. In that case, we speak of a memory leak.
The leaking accumulator
In Chapter 3, Recursion, we saw the accumulator-based approach to summing a list:
sumAcc :: [Integer] -> Integer sumAcc l = go l 0 where go :: [Integer] -> Integer -> Integer go [] acc = acc go (x:xs) acc = go xs (acc + x)
This can also be written using the foldl
recursion scheme from Chapter 4, Higher-Order Functions:
sumAcc' :: [Integer...