今天我正在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的怪癖?
感謝您的任何意見!
問題是'foldl'在生成任何輸出之前總是遍歷整個列表,因此對於無限的數據結構是無用的。你可能想要正確的摺疊 - 「摺疊」。可能還有更多,但這是一個很好的起點。 – Vitus 2012-03-30 06:23:20