在Haskell中将两个列表混合在一起

时间:2015-02-11 06:59:32

标签: haskell

我正在学习Haskell,我想做一个" shuffle"将两个列表混合在一起的功能,直到一个用完为止。因此,shuffle "abc" "defgh"会返回"adbecfgh"。或shuffle "abc" ""返回"abc"

到目前为止,我有:

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

问题在于,它只是将列表中的最短列表的长度洗牌,而不包括较长列表的其余部分。因此shuffle "abc" "defgh"会返回"adbecf"而不是"adbecfgh"

任何人都可以帮我找到更好的方法吗?

2 个答案:

答案 0 :(得分:9)

您可以简单地提供逐点定义:

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

zip*Prelude中的每个Data.List方法都不起作用,因为它们只占用较短列表的长度。

答案 1 :(得分:7)

另一种稍微短一点的方式,就像Zeta建议的那样:

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