将无限列表的表示理解为 haskell 中部分列表的限制
Understanding the representation of inifinite lists as the limit of partial lists in haskell
我正在阅读 this 文章,其中解释了 Haskell 的非严格语义。在作者开始谈论部分列表和无限列表之前,我一直在理解Haskell。
作者说:-
The idea is that an infinite list is to be understood as a limit of partial lists.
之后,作者继续解释表达式的执行:-
filter (< 3) [1..]
结果有点违背我对预期输出的直觉。我认为答案只是列表:- [1, 2]
。但是,不! 虽然作者的解释足以理解执行过程以及我们如何获得最终结果,但并没有解释为什么它会这样工作。
所以,我的问题是 为什么 无限列表表示为一堆部分列表的限制?有人可以在不深入研究复杂的数学术语的情况下解释这一点吗?
谢谢
简而言之,Haskell 编译器并不神奇,尽管它有时看起来很神奇。虽然与其他编程语言相比,某些类型的表达式可能看起来非常声明,但 Haskell 的求值语义实际上非常简单。
因此,在您提到的示例中,filter (< 3) [1..]
,GHC 不“知道”上述表达式的含义。虽然对人类来说很明显 2
之后永远不会有任何元素满足 (< 3)
谓词,但 filter
没有理由知道 最终 是某个元素。出于这个原因,尝试计算除结果列表的前两个元素以外的任何元素都会产生无限循环。
这就是 Haskell 中的无限列表实际上只是“限制”的解释背后的想法。一个真正的分析系统可以处理无限列表,它可以对 all 个元素进行断言。可以简单地从数学上证明 Haskell 表达式 [1..]
表示的无限列表只包含两个小于 3 的元素,但是 Haskell 没有任何这样的分析能力——它是只是一种函数式编程语言。
使用数学极限的类比,我们可以说在给定无限时间和 space 的情况下,评估 [1..]
接近无限列表,但没有它,它只是一个计算 - a承诺我们总是可以根据需要产生更多元素,但与数学无限集不同,它不是对真正无限元素集的某种高级描述。它只是一组具有任意大小的有限元素以及如何获取更多元素的描述。
我正在阅读 this 文章,其中解释了 Haskell 的非严格语义。在作者开始谈论部分列表和无限列表之前,我一直在理解Haskell。
作者说:-
The idea is that an infinite list is to be understood as a limit of partial lists.
之后,作者继续解释表达式的执行:-
filter (< 3) [1..]
结果有点违背我对预期输出的直觉。我认为答案只是列表:- 虽然作者的解释足以理解执行过程以及我们如何获得最终结果,但并没有解释为什么它会这样工作。[1, 2]
。但是,不!
所以,我的问题是 为什么 无限列表表示为一堆部分列表的限制?有人可以在不深入研究复杂的数学术语的情况下解释这一点吗?
谢谢
简而言之,Haskell 编译器并不神奇,尽管它有时看起来很神奇。虽然与其他编程语言相比,某些类型的表达式可能看起来非常声明,但 Haskell 的求值语义实际上非常简单。
因此,在您提到的示例中,filter (< 3) [1..]
,GHC 不“知道”上述表达式的含义。虽然对人类来说很明显 2
之后永远不会有任何元素满足 (< 3)
谓词,但 filter
没有理由知道 最终 是某个元素。出于这个原因,尝试计算除结果列表的前两个元素以外的任何元素都会产生无限循环。
这就是 Haskell 中的无限列表实际上只是“限制”的解释背后的想法。一个真正的分析系统可以处理无限列表,它可以对 all 个元素进行断言。可以简单地从数学上证明 Haskell 表达式 [1..]
表示的无限列表只包含两个小于 3 的元素,但是 Haskell 没有任何这样的分析能力——它是只是一种函数式编程语言。
使用数学极限的类比,我们可以说在给定无限时间和 space 的情况下,评估 [1..]
接近无限列表,但没有它,它只是一个计算 - a承诺我们总是可以根据需要产生更多元素,但与数学无限集不同,它不是对真正无限元素集的某种高级描述。它只是一组具有任意大小的有限元素以及如何获取更多元素的描述。