foldl与foldr的本质区别:从惰性求值说起
Differences Between `Foldl` and `Foldr`

很多人误以为foldl和foldr的区别在于遍历方向,其实两者都是从左到右遍历列表,真正的差异在于结合的关联性。在严格语言中,foldl可以尾递归实现常数空间,而foldr需要栈帧线性增长。但在Haskell这样的惰性语言中,情况反转:默认的foldl会构建巨大的thunk导致空间泄漏,必须使用foldl'来强制求值;而foldr因为惰性特性,能在处理无限列表或流式处理时节省大量工作。理解这些机制,是掌握Haskell函数式编程的关键。
在惰性语言中,foldl之所以糟糕是因为它太懒惰,会构建巨大的thunk,而foldr之所以优秀恰恰是因为它的惰性特性。