为什么这会打败Haskell的懒惰评估?

时间:2012-03-30 05:04:43

标签: haskell lazy-evaluation ghci fold

今天我在Haskell写一个小程序。我发现在ghci的交互模式中,这个:

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的怪癖?

感谢您的任何意见!

1 个答案:

答案 0 :(得分:7)

我认为你的问题是:

foldl在infinte列表中存在一些问题(请参阅HaskelWiki: Fold

但如果您尝试使用foldr last s则会出现问题。 不知道这是否是作业,但我认为你想自己找到解决方案,所以这里有一个提示:而不是折叠看待展开 - 这里是example with the fibonaccis