2015-02-11 94 views
3

我剛剛學習Haskell,我想創建一個「混洗」函數,將兩個列表混合在一起,交替出現,直到一個列表用完。因此,shuffle "abc" "defgh"將返回"adbecfgh"。或者shuffle "abc" ""返回​​。將Haskell中的兩個列表隨機混合在一起

到目前爲止,我有:

shuffle xs ys = concatMap (\(x,y) -> [x,y]) (zip xs ys) 

的問題是,這只是洗牌名單最短列表的長度和不包括長列表的其餘部分。所以shuffle "abc" "defgh"返回"adbecf"而不是"adbecfgh"

任何人都可以幫助我找到更好的方法嗎?

+0

同樣[交錯名單列表](http://stackoverflow.com/questions/14186433/interleave-list-of -lists-in-haskell)類似,但更一般。 – phadej 2015-02-11 07:42:11

回答

9

你可以簡單地提供一個逐點高清:

shuffle :: [a] -> [a] -> [a] 
shuffle [] ys = ys 
shuffle xs [] = xs 
shuffle (x:xs) (y:ys) = x : y : shuffle xs ys 

PreludeData.Listzip*方法是行不通的,因爲他們將只需要較短的列表的長度。

7

另外,略短,這樣做逐點,澤塔建議:

shuffle :: [a] -> [a] -> [a] 
shuffle [] ys = ys 
shuffle (x:xs) ys = x : shuffle ys xs