我想实现一个简单的合并,而不使用任何预定义的东西。任何一个人都可以指向正确的方向,我会使用list comp吗?或者可以被判决等?haskell简单合并
任何提示欢迎..到目前为止,我得到了
merge:: [a] -> [a] -> [a]
mergexs [] = xs
merge [] ys = ys
merge (x:xs) (y:ys) =
我想实现一个简单的合并,而不使用任何预定义的东西。任何一个人都可以指向正确的方向,我会使用list comp吗?或者可以被判决等?haskell简单合并
任何提示欢迎..到目前为止,我得到了
merge:: [a] -> [a] -> [a]
mergexs [] = xs
merge [] ys = ys
merge (x:xs) (y:ys) =
如果 “合并” 你的意思是 “拼接” 名单在一起,就像下面:
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
我想你已经得到了定义,是几乎没有。
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
我以为合并意味着按顺序合并,类似于合并排序。 – 2011-03-22 20:17:02
我真的不希望它排序,是要在后工作:) – Lunar 2011-03-22 20:31:55
错误:)在这种情况下,以斯拉的答案解释它比我更好。 – 2011-03-22 20:35:13
请指出,什么样的合并,你exatly的想。 – fuz 2011-03-22 20:15:29
一个实现可能是'merge =(++)'。这取决于你是否将“++”定义为“任何预先定义的”,这是一个相当模糊的要求。 [来源为++](http://hackage.haskell.org/packages/archive/base/latest/doc/html/src/GHC-Base.html#%2B%2B) – 2011-03-22 20:44:11