Haskell:无限列表 - Haskell多么懒惰?

rap*_*apt 3 haskell

哈斯克尔有多懒惰?

为什么以下不知道何时停止?

sum ([n^2 | n <- [1..], odd (n^2), n^2 < 100])
Run Code Online (Sandbox Code Playgroud)

Seb*_*edl 12

这不是关于它是多么懒惰,而是它是否有任何方式可能知道n^2 < 100一旦它是假的,它将永远不再是真的.它没有.

数组理解的这些部分是过滤表达式,而不是停止条件.

  • 而且财产也取决于类型.想象一个环,其中`x ^ 2> 100`但是`(succ x)^ 2 <100` - 第一个过滤后的元素并不意味着所有类型都没有更多的过滤元素. (4认同)

Rei*_*ton 7

仅仅因为11 ^ 2超过100并不意味着13 ^ 2超过100.嗯......好吧,确实如此,但GHC应该如何解决这个问题呢?它是一个编译器,而不是任意数学真理的证明者.

  • 在其他有些神奇的属性中,用户似乎认为功能编译器具有超过常见的编译器...自动记忆,任意部分评估,代数重写...... (4认同)