可能重复:
对无限列表的有限理解
我无法理解为什么ghci无法正确计算此代码?
[x | x <- [1..], x < 1000]
Run Code Online (Sandbox Code Playgroud)
Ghci只是停在最后一个号码,我需要在命令行中断这个过程以恢复正常状态.怎么了?我希望这段代码可以工作,因为haskell的懒惰评估.
哈斯克尔有多懒惰?
为什么以下不知道何时停止?
sum ([n^2 | n <- [1..], odd (n^2), n^2 < 100])
Run Code Online (Sandbox Code Playgroud) 我想得到所有偶数<= 1000的总和.
以下代码:
sum [x | x <- [1..1000], even x] (我知道可以用[2,4..1000]完成,这是为了练习)
报告总和是250500.
然而:
sum [x | x <- [1..], even x && x <= 1000]
从未完成,必须中断!
我认为我可以安全地编写[1..],这是一个无限的列表,因为Haskell不会尝试评估它.
此外,我认为它只是开始x x,检查并添加它们.
那么为什么上面的结果不能产生呢?
原谅我的愚蠢问题,我是Haskell的新手.
我在Haskell中尝试了以下内容:
sum [fib n| n <- [1..], (even (fib n) && fib n < 4000000)]
Run Code Online (Sandbox Code Playgroud)
这需要无限的时间.如果我遗漏n <- [1..],解决方案立即出现.
我认为这无关紧要,因为Haskell正在评估懒惰.我是否误解了懒惰的评价?
我想这个:
[i | i <- [1..], i < 5]
Run Code Online (Sandbox Code Playgroud)
会产生
[1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
就像
take 4 [i | i <- [1..]]
Run Code Online (Sandbox Code Playgroud)
有限长度列表.
但它没有,它似乎是无限的,因为任何将它视为有限列表的尝试只会导致挂起(ghci).
我不确定如何理解这一点.它是某种无限的发电机,它只是在第四项之后什么都不产生但从未停止过?
基本上代码不断生成新项目,因为它不知道它们永远不能满足标准?