2012-03-30 86 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