Cha*_*dan 2 haskell types list infinite
我正在阅读这篇文章,它解释了Haskell的非严格语义.直到作者开始讨论Haskell中的Partial和Infinite Lists,我才明白.
作者说: -
这个想法是无限列表被理解为部分列表的限制.
之后,作者继续解释表达式的执行: -
filter (< 3) [1..]
结果有点违背我对预期输出的直觉.我认为答案就是清单: - 虽然作者解释了足以理解执行过程以及我们如何得到最终结果,但它并不能解释为什么它如此工作.[1, 2].但是,不!
所以,我的问题是为什么无限列表被表示为一堆部分列表的限制?有人可以解释这个问题而不必深入研究复杂的数学术语吗?
谢谢
简单来说,Haskell编译器并不神奇,但有时可能会显得神奇.虽然与其他编程语言相比,某些表达式似乎非常具有声明性,但Haskell的评估语义实际上非常简单.
因此,在您提到的示例中filter (< 3) [1..],GHC并未"了解"有关上述表达式含义的任何内容.虽然对于人类来说显然比在2满足(< 3)谓词之后永远不会有任何元素,但是没有理由filter可以意识到最终不会有某些元素可以做到.因此,尝试评估结果列表的前两个元素以外的任何内容将产生无限循环.
这就是解释Haskell中的无限列表实际上只是"限制"的理念.一个真正的分析系统可以使用无限列表,它可以对所有元素进行断言.从数学角度来说,可以简单地证明Haskell表达式表示的无限列表[1..]只包含两个小于3的元素,但Haskell没有任何这样的分析能力 - 它只是一种函数式编程语言.
使用模拟到数学极限,我们可以说评估[1..]在给定无限量的时间和空间的情况下接近无限列表,但没有它,它只是一个计算 - 我们可以随时产生更多元素的承诺,但不同于一个数学无限集,它不是一个真正无限的元素集的一些高级描述.它只是一组有限的元素,具有任意大小,并描述了如何获得更多.