为什么Haskell标准库中没有scanl'函数?

时间:2013-11-22 01:34:16

标签: haskell

foldl功能带有严格的模拟foldl'。是scanl不需要scanl'替代方案还是仅仅将其包含在标准库中的原因?

2 个答案:

答案 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}}的方式执行时强制它。