List 在Haskell中合并3个列表

List 在Haskell中合并3个列表,list,haskell,mergesort,List,Haskell,Mergesort,我想知道如何将3个列表合并成一个列表 下面是合并两个列表 merge :: Ord a => [a] -> [a] -> [a] merge xs [] = xs merge [] ys = ys merge (x:xs) (y:ys) | x <= y = x:merge xs (y:ys) | otherwise = y:merge (x:xs) ys merge::Ord a=>[a]->[a]->[a]->

我想知道如何将3个列表合并成一个列表

下面是合并两个列表

 merge :: Ord a => [a] -> [a] -> [a]
 merge xs [] = xs
 merge [] ys = ys
 merge (x:xs) (y:ys) | x <= y    = x:merge xs (y:ys)
                     | otherwise = y:merge (x:xs) ys
merge::Ord a=>[a]->[a]->[a]->[a]
合并xs[]=xs
合并[]ys=ys

merge(x:xs)(y:ys)|x您的
merge
函数已经可以合并两个列表,由于它是一个二进制关联操作,您可以执行以下操作:

list1`merge`(list2`merge`list3)
或者更一般地说,如果要合并任意数量的列表:

mergeAll::Ord a=>[[a]]->[a]
mergeAll=foldl merge[]

Wikipedia对此有很好的解释。

Wow,一个罕见的情况,非严格的
foldl
是合理的:)是的,但是如果严格成为一个问题,他们可能会使用
array
containers
而不是链表P@ephemient然而,它仍然不比foldr
好多少。顺便说一句,在所有列表长度相似的情况下,这种
mergeAll
是渐进的不好——最好以树状模式合并
mergeAll xss=mergeAll(uncurry merge-adjacentPairs-xss)
(加上适当的基本情况)@luqui,因为
foldl'
强制执行的唯一事情是列表头,实际上,
foldl
foldl'
之间没有区别。这与存在差异的常见情况相反,因此我最初的评论是。@ephemient我观察到时间差异为1.5倍。当然,你也说得对,名单的标题是唯一的区别。但是
foldl
的列表头比
foldl'
的列表头要深500万图恩,这在这里确实有很大的不同
foldl
仍然需要证明它值得关注(但我认为它现在正通过继续糟糕而引起我们的关注)。当您在输出列表中进一步选择时,它们开始在时间上具有可比性,正如预期的那样。