【发布时间】:2012-01-04 08:49:33
【问题描述】:
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' 的行为?
【问题讨论】:
标签: haskell fold strictness