使用带有列表理解问题的takeWhile AND过滤器

时间:2013-11-18 02:34:40

标签: haskell filter list-comprehension ghci

我很困惑为什么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..]]

到底发生了什么事?

2 个答案:

答案 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]