将 Haskell 中的两个列表洗牌

Shuffle together two lists in Haskell

我正在学习 Haskell,我想制作一个 "shuffle" 函数,将两个列表混在一起,交替进行,直到一个用完。所以,shuffle "abc" "defgh" 会 return "adbecfgh"。或者 shuffle "abc" "" returns "abc"

到目前为止我有:

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

问题是它只是根据最短列表的长度对列表进行洗牌,而不包括较长列表的其余部分。所以 shuffle "abc" "defgh" returns "adbecf" 而不是 "adbecfgh"

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

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

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

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

按照 Zeta 的建议,另一种更短的逐点方法:

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