2011-03-22 81 views
2

我想实现一个简单的合并,而不使用任何预定义的东西。任何一个人都可以指向正确的方向,我会使用list comp吗?或者可以被判决等?haskell简单合并

任何提示欢迎..到目前为止,我得到了

merge:: [a] -> [a] -> [a] 
mergexs [] = xs 
merge [] ys = ys 
merge (x:xs) (y:ys) = 
+1

请指出,什么样的合并,你exatly的想。 – fuz 2011-03-22 20:15:29

+0

一个实现可能是'merge =(++)'。这取决于你是否将“++”定义为“任何预先定义的”,这是一个相当模糊的要求。 [来源为++](http://hackage.haskell.org/packages/archive/base/latest/doc/html/src/GHC-Base.html#%2B%2B) – 2011-03-22 20:44:11

回答

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  
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 
+0

我以为合并意味着按顺序合并,类似于合并排序。 – 2011-03-22 20:17:02

+0

我真的不希望它排序,是要在后工作:) – Lunar 2011-03-22 20:31:55

+1

错误:)在这种情况下,以斯拉的答案解释它比我更好。 – 2011-03-22 20:35:13