Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 理解有限表的表示为haskell中部分表的极限_List_Haskell_Types_Infinite - Fatal编程技术网

List 理解有限表的表示为haskell中部分表的极限

List 理解有限表的表示为haskell中部分表的极限,list,haskell,types,infinite,List,Haskell,Types,Infinite,我正在阅读一篇解释Haskell非严格语义的文章。直到作者开始谈论Haskell中的部分和无限列表,我才明白 作者说:- 其思想是将无限列表理解为部分列表的极限 然后,作者继续解释表达式的执行:- 过滤器(,您可以选择 n>代码>您想要的大。哦,是的。对不起,我把filter和takewhile搞混了。我对哈斯克尔很陌生。为这愚蠢的混乱感到抱歉。我现在编辑这个问题。

我正在阅读一篇解释Haskell非严格语义的文章。直到作者开始谈论Haskell中的部分和无限列表,我才明白

作者说:-

其思想是将无限列表理解为部分列表的极限


然后,作者继续解释表达式的执行:-

过滤器(<3)[1..]

结果有点违背我对预期输出的直觉。我想答案很简单,就是列表:-
[1,2]
。但是,不!!。虽然作者的解释足以理解执行过程以及我们如何得到最终结果,但它不能解释为什么它会这样工作

所以,我的问题是,为什么无限列表被表示为一组部分列表的极限?有人能在不深入研究复杂的数学术语的情况下解释这一点吗


简单地说,Haskell编译器并不神奇,不管它有时看起来多么神奇。虽然与其他编程语言相比,某些类型的表达式可能看起来非常具有声明性,但Haskell的求值语义实际上非常简单

因此,在您提到的示例中,
filter(<3)[1..]
,GHC对上述表达式的含义一无所知。虽然对人类来说,
2
之后永远不会有任何元素满足
(<3)
谓词,但没有理由
过滤器
能够意识到最终不会有任何元素满足。因此,尝试计算结果列表的前两个元素以外的任何元素都将产生一个无限循环

这就是解释Haskell中无限列表实际上只是“极限”的想法。一个真正的分析系统可以处理无限的列表,并且可以对其所有元素进行断言。我们可以从数学上证明,Haskell表达式表示的无限列表只包含两个小于3的元素,但Haskell没有任何这样的分析能力—它只是一种函数式编程语言


使用数学极限的类比,我们可以说,计算
[1..]
接近给定无限时间和空间的无限列表,但如果没有无限时间和空间,它只是一个计算——如果我们想要,我们总是可以产生更多元素,但与数学无限集不同,它不是对一组真正无限的元素的高级描述。它只是一组具有任意大小的有限元素,以及如何获得更多元素的描述。

为什么您认为结果会是
[1,2]
<代码>过滤器无法知道何时停止检查元素。。。例如,考虑:<代码>循环[1…n] < /代码>包含无限数量的<代码> 1 <代码> s和<代码> 2 <代码> s,但是如果只查看有限前缀,它看起来非常类似于代码> [1…] /代码>,您可以选择<代码> n>代码>您想要的大。哦,是的。对不起,我把
filter
takewhile
搞混了。我对哈斯克尔很陌生。为这愚蠢的混乱感到抱歉。我现在编辑这个问题。