Firstly, Real World Haskell, which I am reading, says to never use foldl and instead use foldl'. So I trust it.
But I’m hazy on when to use foldr vs. foldl'. Though I can see the structure of how they work differently laid out in front of me, I’m too stupid to understand when ‘which is better.’ I guess it seems to me like it shouldn’t really matter which is used, as they both produce the same answer (don’t they?). In fact, my previous experience with this construct is from Ruby’s inject and Clojure’s reduce, which don’t seem to have ‘left’ and ‘right’ versions. (Side question: which version do they use?)
Any insight that can help a smarts-challenged sort like me would be much appreciated!
The recursion for
foldr f x yswhereys = [y1,y2,...,yk]looks likewhereas the recursion for
foldl f x yslooks likeAn important difference here is that if the result of
f x ycan be computed using only the value ofx, thenfoldrdoesn’t’ need to examine the entire list. For examplereturns
Falsewhereasnever terminates. (Note:
repeat Falsecreates an infinite list where every element isFalse.)On the other hand,
foldl'is tail recursive and strict. If you know that you’ll have to traverse the whole list no matter what (e.g., summing the numbers in a list), thenfoldl'is more space- (and probably time-) efficient thanfoldr.