答案 0 :(得分:12)
没有必要。 foldl'
的严格性允许它在遍历输入列表时立即消除thunk。
foldl' (+) 0 [1,2,3] foldl (+) 0 [1,2,3]
foldl' (+) 1 [2,3] foldl (+) (0 + 1) [2,3]
foldl' (+) 3 [3] foldl (+) ((0 + 1) + 2) [3]
foldl' (+) 6 [] foldl (+) (((0 + 1) + 2) + 3) []
6 (((0 + 1) + 2) + 3)
((1 + 2) + 3)
(3 + 3)
6
但是当你scanl
时,它会产生一个包含这些步骤的列表
scanl (+) 0 [1,2,3]
[ 0
, 0 + 1
, (0 + 1) + 2
, ((0 + 1) + 2) + 3
]
并且您必须遍历整个列表以查看最终结果,该结果可让您控制如何强制使用thunk。这将评估控制推向了列表的消费者。
答案 1 :(得分:6)
好吧,我不确定scanl'
是不是需要,但它可能比foldl'
更为罕见,因为你通常会消耗scanl
的结果。元素foldl'
逐个元素,因此在完全按照{{1}}的方式执行时强制它。