将 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
Prelude
或 Data.List
中的每个 zip*
方法都不起作用,因为它们只会占用较短列表的长度。
按照 Zeta 的建议,另一种更短的逐点方法:
shuffle :: [a] -> [a] -> [a]
shuffle [] ys = ys
shuffle (x:xs) ys = x : shuffle ys xs
我正在学习 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
Prelude
或 Data.List
中的每个 zip*
方法都不起作用,因为它们只会占用较短列表的长度。
按照 Zeta 的建议,另一种更短的逐点方法:
shuffle :: [a] -> [a] -> [a]
shuffle [] ys = ys
shuffle (x:xs) ys = x : shuffle ys xs