foldl' and foldr'
These are strict versions of foldl
and foldr
. Remember, lazy evaluation
means that we build up potentially large expressions before finally evaluating
them when we need to know the value of the expression. If we fold up a list
using foldl (+) 0 [1..1000000]
, then this builds the massive expression
(((0 + 1) + 2) + ... + 1000000)
and evaluates it only once we ask for its
value.
The expression foldl' (+) 0 [1..1000000]
behaves differently. It immediately
evaluates the subexpression 0 + 1
to obtain the value 1
. Then it evaluates
the expression 1 + 2
to obtain the value 3
. Then it evaluates 3 + 3
to
obtain 6
. And so on until it adds the final number, 1000000
to the sum. At
any given point during the evaluation, all we have is a number. Thus, this takes
constant space, whereas the expression foldl (+) 0 [1..1000000]
would use
linear space to store the whole expression (((0 + 1) + 2) + ... + 1000000)
before evaluating it.
The difference between foldr
and foldr'
is the same.