2014-01-26 39 views
-2

我需要編寫一個函數來合併兩個列表。完全像'++'正在工作。Haskell自己的函數合併兩個列表

let x = merge [1,2,3] [3,3,4] -- should output [1,2,3,3,3,4] 

應該怎麼做?

編輯:解決方案是

merge :: [a] -> [a] -> [a] 
merge []  ys = ys 
merge (x:xs) ys = x : (merge xs ys) 
+0

也許這? http://stackoverflow.com/a/3938449/1423473 – erthalion

+0

@erthalion不,這是一個未排序的插值。這合併排序或連接,我認爲他們要求連接。 –

+0

erthalion,這不是我正在尋找的大塊所說的。 – user3235761

回答

1

也許這樣的事情。

merge :: (a -> a -> Bool) -> [a] -> [a] -> [a] 
merge pred xs []   = xs 
merge pred [] ys   = ys 
merge pred (x:xs) (y:ys) = 
    case pred x y of 
    True -> x: merge pred xs (y:ys) 
    False -> y: merge pred (x:xs) ys 

(++) xs ys = merge (\x y -> compare x y == LT) xs ys 

或者,如果你只需要重複的功能(++),你可以看一下它的定義與hoogle最終導致你到source code

(++) []  ys = ys 
(++) (x:xs) ys = x : xs ++ ys