Haskell 有两个用于列表的左折叠函数:foldl
和一个“严格”版本,foldl'
. 非严格的问题foldl
在于它构建了一个 thunk 塔:
foldl (+) 0 [1..5]
--> ((((0 + 1) + 2) + 3) + 4) + 5
--> 15
这会浪费内存,如果列表中的项目太多,可能会导致堆栈溢出。 foldl'
,另一方面,在每个项目上强制累加器。
但是,据我所知,foldl'
在语义上等同于foldl
. 评估foldl (+) 0 [1..5]
头部正常形式需要在某个点强制累加器。如果我们不需要一个 head-normal 形式,我们就不会foldl (+) 0 [1..5]
开始评估。
是否有任何令人信服的理由想要 的 行为foldl
超过 的foldl'
?