2012-03-30 36 views
3

今天我正在Haskell寫一個小程序。我發現,在ghci中的交互模式,這樣的:這爲什麼會打敗Haskell的懶惰評價?

take 100 $ foldl (\s a -> s ++ [last s + a]) [0] (1:[6,12..]) 

會掛起ghci中,並使其崩潰,由於內存不足,但這:

take 100 $ foldl (\s a -> s ++ [last s + a]) [0] (1:[6,12..606]) 

可以運行得很好。

爲什麼Haskell的懶惰評估不能使第一個在內存(3G,BTW)內運行?或者,也許這是ghci的怪癖?

感謝您的任何意見!

+3

問題是'foldl'在生成任何輸出之前總是遍歷整個列表,因此對於無限的數據結構是無用的。你可能想要正確的摺疊 - 「摺疊」。可能還有更多,但這是一個很好的起點。 – Vitus 2012-03-30 06:23:20

回答

7

我覺得你的問題是這樣的:

foldl有一些問題,infinte列表(見HaskelWiki: Fold

但是,如果您嘗試使用foldrlast s將是一個問題。 不知道這是否是功課,但我認爲你想自己找到解決方案,所以這裏是一個提示:而不是摺疊尋找一個展開 - 這裏是一個example with the fibonaccis

+2

不,foldl對於無限列表沒有問題,只是在程序運行到最後時纔會遇到問題,而且會消耗大量內存。 :) – Ingo 2012-03-30 08:11:12

+0

謝謝!這不是一個家庭作業,但我很興奮地瞭解Haskell的更多信息(並且在你回答我的問題之前,我完全誤解了foldl和foldr) – 2012-03-30 09:01:20

+0

使用'foldr',但是切換摺疊函數的參數 – is7s 2012-03-30 11:41:13