Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.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
制作Haskell函数以处理无限列表_Haskell - Fatal编程技术网

制作Haskell函数以处理无限列表

制作Haskell函数以处理无限列表,haskell,Haskell,我想知道如何将函数转换为使用无限列表 例如,我有一个函数来还原列表列表 innerReverse[[1,2,3]]将返回[[3,2,1]]。然而,当我尝试使用10$innerReverse[[1..]]时,它基本上运行在一个无限循环中 当我使用innerReverse[take 10[1..]时,它给出的结果是:[[10,9,8,7,6,5,4,3,2,1]Haskell是一种惰性语言,这意味着只有在实际使用结果之前才执行求值。这就是Haskell拥有无限列表的原因;到目前为止,只有您访问的列表

我想知道如何将函数转换为使用无限列表

例如,我有一个函数来还原列表列表

innerReverse[[1,2,3]]将返回[[3,2,1]]。然而,当我尝试使用10$innerReverse[[1..]]时,它基本上运行在一个无限循环中

当我使用innerReverse[take 10[1..]时,它给出的结果是:[[10,9,8,7,6,5,4,3,2,1]

Haskell是一种惰性语言,这意味着只有在实际使用结果之前才执行求值。这就是Haskell拥有无限列表的原因;到目前为止,只有您访问的列表部分实际存储在内存中

无限列表的概念使你试图做的事情变得不可能。在列表[1..]中,第一个元素是1。最后一个元素是什么?答案是这是一个骗人的问题;没有无限列表结束的概念。同样地,[1..]反面的第一个元素是什么?再说一次,这是一个诡计多端的问题。最后一个元素是1,但列表没有开头


[1..]的反面不是[10,9,8,7,6,5,4,3,2,1]。后者的反面是[1,2,3,4,5,6,7,8,9,10],而不是[1..]。

那么您想反转无限列表吗?你需要等一下。@zerkms对不起。什么意思?没有办法?好吧,请把你期望看到的结果放在反向[1..]调用中。顺便说一句,您的第一个模式匹配应该接受一个空列表并返回一个空列表。这样可以避免重复。不,您不需要,但是当您执行take 1 reverse[1..]时,您要求haskell具体化整个无限列表。您的预期结果不正确,请再次查看评论。要想知道为什么您的预期结果是错误的,请尝试通过[1..99999],它不是无限的,但足够大,您可以看到实际结果。然后将上限更改为999999并比较结果。innerReverse[take 10[1..]-是完全不同的调用。这与innerReverse[[1..10]]相同,因此它与函数中的无限列表无关,因为函数现在接受有限的物化列表“没有无限列表结尾的概念”-实际上这是一个完全矛盾的说法。@leftaroundabout,这取决于您称之为无限的内容。“没有无止境列表结束的概念。@leftaroundabout,这是Haskell和集合论的区别之一;数学家会认为[0..]是ω,[0..]+[0..]是2ω。但是哈斯凯尔无法区分它们。@dfuer我不确定我是否理解你的例子。你是在用++模拟联合运算吗?@JustinLardinois,我假装它是超限序数加法:-