2013-11-22 31 views

回答

11

不需要它。 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如何強制每一個列表。這將評估的控制推向列表的消費者。

6

嗯,我不知道,如果scanl'需要,但它可能是一個比foldl'非常罕見的需要,因爲你通常消耗的元素scanl元素的結果,因而迫使它作爲你走就像foldl'一樣。

相關問題