I would say a good practice with folds (and maybe in Haskell in general) is that either all be strict or all be lazy.

In the expression: foldXX f init list:

Remember that foldr does:
x `f` ( ... the accumulator ... )
and foldl:
(... the accumulator ...) `f` x

The accumulator has to match a non-strict argument of f, so that f will be able to return results even if the accumulator is not fully evaluated.

More detailed:
if f is lazy in its second argument, then use foldr. Everything is lazy, you build a very small thunk since nothing is evaluated.
In the rare cases where f is (also) lazy in its first argument, you can use foldl.
And of course, if f is strict in both its arguments, then use foldl'. Everything is then strict, you build no thunk.



2011/11/20 David Fox <ddssff@gmail.com>
Does anyone have a quick way to decide which of the fold functions to
use in a given situation?  There are times when I would like to find
out which to use in the quickest way possible, rather than reading a
long explanation of why each one behaves the way it does.

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe