我正在使用 Euler 项目自学 Haskell,但我在推理我的代码是如何被 Haskell 执行时遇到了一些麻烦。第二个问题让我计算所有偶数斐波那契数的总和,最高可达 400 万。我的脚本如下所示:
fibs :: [Integer]
fibs = 1 : 2 : [ a+b | (a,b) <- zip fibs (tail fibs)]
evens :: Integer -> Integer -> Integer
evens x sum | (even x) = x + sum
| otherwise = sum
main = do
print (foldr evens 0 (take 4000000 fibs))
Hugs 给出错误“垃圾收集无法回收足够的空间”,我认为这意味着列表条目没有被释放,因为它们被foldr
.
我需要做什么来解决这个问题?我尝试编写一个使用累加器的尾递归(我认为)版本,但也无法让它工作。