我正在尝试实现一个简单的合并,而不使用任何预定义的东西。任何人都可以指出我正确的方向,我会使用list comp吗?还是反悔等?
任何提示欢迎..到目前为止我得到了
merge:: [a] -> [a] -> [a]
mergexs [] = xs
merge [] ys = ys
merge (x:xs) (y:ys) =
答案 0 :(得分:4)
我认为你的定义几乎就在那里。
merge :: [a] -> [a] -> [a]
首先,您需要让Haskell知道您要合并的数据是可订购的。
merge :: Ord a => [a] -> [a] -> [a]
merge xs [] = xs
merge [] ys = ys
你在这里定义的条件对我来说很好。以任何方式合并空列表只会产生另一个列表。所以你现在要做的就是定义你想要合并的条件。有三种情况需要考虑。 x小于y,x大于y或它们都相等。
merge (x:xs) (y:ys) | x < y = undefined
| x > y = undefined
| otherwise = undefined
我认为你想要使用递归方法。听起来你只是想要一个暗示而不是直接回答。如果您正在逐步合并它们,请考虑如何手动列出这样的列表。
merge [1,2] [3,4] -- Choose the minimum element and then use merge again
1 : merge [2] [3,4] -- to get the rest of the list
1 : 2 : merge [] [3,4] -- Repeat until nothing else to merge
1 : 2 : 3 : 4
答案 1 :(得分:2)
如果通过“合并”,您的意思是“拼接”列表,如下所示:
merge "aaaaaaaaa" "bbbbbb"
>>> "ababababababaaa"
merge "lunar" "solar"
>>> "lsuonlaarr"
你可以说:
merge :: [a] -> [a] -> [a]
merge xs [] = xs
merge [] ys = ys
merge (x:xs) (y:ys) = x:y:merge xs ys