我很困惑为什么GHCI无限地计算这个列表:
takeWhile (>0) [x^2 | x <- [100, 99..], odd x]
然而,此列表会停止并按预期计算:
takeWhile (>0) [x | x <- [100, 99..], odd x]
我在这里缺少什么?为什么平方输入会导致takeWhile(&gt; 0)无效?
此外,此列表按预期结束...为什么会终止但不会终止另一个?
takeWhile (<1000) [x^2 | x <- [1..], odd x]
另外,如果我从第一个列表中删除奇数x过滤器,它会正确终止:
takeWhile (>0) [x^2 | x <- [100, 99..]]
到底发生了什么事?
答案 0 :(得分:7)
因为x^2 >= 0
始终为真。所以你确实有一个无限的列表,例如
-1 * -1 = 1 > 0
这只是数学。
因此x^2 > 0
只有x = 0
失败的情况。odd x
。当0
条件存在x=0
时,100 * 100 > 1000
永远不会被考虑,因此列表永远不会终止。当您将其删除时,它会在{{1}}时停止。
最后,第三个列表自{{1}}以来一直终止。
答案 1 :(得分:2)
x^2
, >0
始终为x /= 0
。
您可以将列表更改为:
[x^2 | x <- [100, 99..], odd x, x > 0]