合并两个列表的算法

时间:2015-09-06 03:00:05

标签: list haskell

我尝试合并两个元组列表xy。基本上我有这些清单:

[("hello", "hi"), ("foo", "baz"), ("this", "that")]

--and

[("foo", "bar"), ("hello", "world"), ("goo", "boo")]

--the result should be

[("hello", "world"), ("foo", "bar"), ("this", "that")]

到目前为止我写过这个:

merge :: (Eq a) => [(a, b)] -> [(a, b)] -> [(a, b)]
merge [] _ = []
merge _ [] = []
merge (x:xs) (y:ys)
    | fst x == fst y = (fst y, snd y) : merge xs ys
    | otherwise = (fst x, snd x) : merge xs ys

此解决方案的问题在于它仅合并相同的索引。如何有效地迭代第二个列表并将其合并到第一个列表?

1 个答案:

答案 0 :(得分:1)

现在,如果otherwise子句不匹配,您的代码会丢弃xy。它应该尝试将xys的其余部分合并。一些提示:[x]是一个可以传递给merge的列表,如果你能想出一种分解和克服问题的方法,你可以用++连接一对列表。

正确的解决方案将涉及组合不同步骤的结果,当您开始这样做时,有效的方法将是尾递归。