在 Haskell 中合并 3 个列表

Mee*_*eem 4 mergesort haskell list

我想知道如何将 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
Run Code Online (Sandbox Code Playgroud)

如果我想合并三个列表怎么办?

Fab*_*iel 8

您的merge函数已经可以合并两个列表,并且由于它是一个二元关联操作,您可以执行以下操作:

list1 `merge` (list2 `merge` list3)
Run Code Online (Sandbox Code Playgroud)

或者更一般地说,如果您想合并任意数量的列表:

mergeAll :: Ord a => [[a]] -> [a]
mergeAll = foldl merge []
Run Code Online (Sandbox Code Playgroud)

维基百科对Folding有很好的解释。

  • @ephemient 但是它仍然不比 `foldr` 好。顺便说一句,在所有列表长度相似的情况下,这个 `mergeAll` 是渐近糟糕的 - 最好以树状模式合并 `mergeAll xss = mergeAll (uncurry merge &lt;$&gt;adjacentPairs xss)` (加上适当的基本情况) (3认同)
  • @ephemient 我观察到时间差异为 1.5 倍。当然,您也是对的,列表头是唯一的区别。但“foldl”的列表头比“foldl”深 500 万次重击,这确实产生了相当大的差异。`foldl` 仍然没有证明它值得关注(但我想它现在通过继续蹩脚而引起了我们的注意)。当您在输出列表中进一步咀嚼时,它们开始在时间上变得可比,正如预期的那样。 (2认同)