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

hug*_*omg 11 haskell

foldl功能配有严格的模拟功能foldl'.有没有理由scanl不需要scanl'替代品,或者他们只是不将它包含在标准库中?

J. *_*son 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
Run Code Online (Sandbox Code Playgroud)

但是当你这样做scanl时会产生一个包含这些步骤的列表

scanl (+) 0 [1,2,3]
[   0
,   0 + 1
,  (0 + 1) + 2
, ((0 + 1) + 2) + 3
]
Run Code Online (Sandbox Code Playgroud)

并且您必须遍历整个列表以查看最终结果,该结果可让您控制如何强制使用thunk.这将评估控制推向列表的消费者.


Dan*_*ner 6

嗯,我不知道scanl'是不是需要,但它可能是一个比非常罕见的需要foldl',因为你通常消耗的结果scanl逐个元素,从而迫使它为你去完全相同的方式foldl'一样.