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

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
List 如何在Haskell中合并有限数量的无限列表?_List_Haskell_Functional Programming - Fatal编程技术网

List 如何在Haskell中合并有限数量的无限列表?

List 如何在Haskell中合并有限数量的无限列表?,list,haskell,functional-programming,List,Haskell,Functional Programming,对于赋值,我需要编写一些Haskell代码,它有一个由无限个整数列表组成的有限列表作为输入,每个列表单调递增 现在,我需要将它们合并到一个列表中,对整数进行排序。此外,一些整数可能出现在多个列表中:在输出列表中,每个整数在列表中只出现一次 因此,如果输入是例如[[1,2,6,10,28,40,][3,4,10,28,100,][任何数量的列表]],那么输出应该是[1,2,3,4,6,10,28,40,100,] 我有点困在这里了。我不知道如何有效地使用foldr合并列表。我想我应该比较每个列表的

对于赋值,我需要编写一些Haskell代码,它有一个由无限个整数列表组成的有限列表作为输入,每个列表单调递增

现在,我需要将它们合并到一个列表中,对整数进行排序。此外,一些整数可能出现在多个列表中:在输出列表中,每个整数在列表中只出现一次

因此,如果输入是例如[[1,2,6,10,28,40,][3,4,10,28,100,][任何数量的列表]],那么输出应该是[1,2,3,4,6,10,28,40,100,]


我有点困在这里了。我不知道如何有效地使用
foldr
合并列表。我想我应该比较每个列表的标题,并从中创建一个新的列表。

您可以通过合并两个无限排序的列表来简化问题,然后尝试概括。合并的框架将如下所示:

mergeSorted :: Ord a => [a] -> [a] -> [a]
mergeSorted [] ys = ys
mergeSorted xs [] = xs
mergeSorted (x:xs) (y:ys) = ???
您必须比较x和y,并做一些明智的事情,可能涉及到对mergesorder的递归调用:这看起来不太糟糕,对吧

现在,让我们想象一下mergeSorted可以工作,您可以将两个无限排序列表转换为一个无限排序列表。如何将N个无限排序列表转换为单个排序列表?为什么,这是一个简单的折叠!只需将两个列表合并在一起,然后将第三个列表与该列表合并,第四个列表与该列表合并,依此类推

mergeAll :: Ord a => [[a]] -> [a]
mergeAll xss = foldr ???
我们可以通过反复从任何一个列表中拉出一个最小元素,通过
unbover pull
unbover
位于
Data.List
中),合并任意一对无限单调递增的列表(如您所拥有的)

要重复一个步骤直到满足一个条件,
until的工作是:

uniquelyMerge xs = ... (until (...) (pairs (unfoldr pull)) xs)
.....

不要忘记处理空列表的情况。

对无限列表进行排序通常不是很容易。如果我有输入
[[1,3,4,5,6,…],[1,3,5,7,…]
,我开始对它们进行排序,得到
[1,3,4,5,6,7,…]
,我怎么知道2不会出现在这两个输入列表中的某个位置?除非你知道列表是单调递增的,我猜这是在作业中说明的。你能确认一下并告诉我们你试过什么吗?如果你不仅仅是说“告诉我怎么做”,这里的人通常会更有帮助。你不需要对这些列表进行排序,你需要合并它们。它们必须已经分类了。你不能对一个无限的列表进行排序。我说的确实是错的。列表是单调递增的。因此,合并确实是需要的。你有没有想过如何合并两个列表?我会咬,我不知道如何用FordDR来解决“<代码>的合并[[ 1 ],[ 7 ],[ 3 ],[ 2 ] ] < /C> > MHITZA(注:OP,你可以认为这是一个扰流板):容易。code>mergeAll=foldr mergeSorted[];mergeAll[[1],[7],[3],[2]]
然后计算为
[1,2,3,7]
,正如预期的那样。@在这种情况下,最简洁的答案是使用unionAll from Data.List.Ordered,这正是OP所寻找的。Ganesh,不要查看unionAll的源代码,除非你不介意完整的破坏者。一般来说,Data.List.Ordered包含对有序列表进行操作的函数。@fgv我希望使用标准HOFs(折叠/展开/直到)完成此操作,正如OP中提到的“使用foldr”。mergeAll而不是unionAll解决了此处发布的问题。编辑:哇,等等,我这段时间都漏掉了问题中的一句话!我想这是联合,不是合并。幸运的是,我的骨骼功能仍然很好。
pairs f (x:y:t)  = f (x,y) : pairs f t
pairs _ t        = t
uniquelyMerge xs = ... (until (...) (pairs (unfoldr pull)) xs)
.....