【问题标题】:merging 3 lists in Haskell在 Haskell 中合并 3 个列表
【发布时间】:2021-02-19 18:08:23
【问题描述】:

我想知道如何将 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

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

【问题讨论】:

    标签: list haskell mergesort


    【解决方案1】:

    您的merge 函数已经可以合并两个列表,因为它是一个二进制关联操作,您可以这样做:

    list1 `merge` (list2 `merge` list3)
    

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

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

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

    【讨论】:

    • 哇,非严格的foldl 是合理的罕见情况:)
    • 是的,但如果严格性成为一个问题,他们可能会使用来自arraycontainers 的东西,而不是链表。 :P
    • @ephemient 但是它仍然不比foldr 好。顺便说一句,这个mergeAll 在所有列表长度相似的情况下渐近糟糕——最好以树状模式合并mergeAll xss = mergeAll (uncurry merge &lt;$&gt; adjacentPairs xss)(加上适当的基本情况)
    • @luqui 由于foldl' 唯一的作用是列表头,foldlfoldl' 之间实际上没有区别。这与存在 差异的常见情况相反,因此是我的原始评论。
    • @ephemient 我观察到时间差为 1.5 倍。当然,您也是正确的,列表头是唯一的区别。但是foldl 的列表头比foldl' 深500 万,这在这里确实有很大的不同。 foldl 仍然没有证明它值得关注(但我想它现在通过继续糟糕而引起了我们的注意)。当您在输出列表中进一步挖掘时,它们开始在时间上变得可比,正如预期的那样。
    猜你喜欢
    • 2011-04-25
    • 1970-01-01
    • 2012-01-11
    • 2014-09-30
    • 2016-04-18
    • 2017-10-26
    • 2017-10-06
    • 1970-01-01
    相关资源
    最近更新 更多