bog*_*jov 24 merge haskell functional-programming list interleave
无法弄清楚如何在Haskell 中以下列方式合并两个列表:
INPUT: [1,2,3,4,5] [11,12,13,14]
OUTPUT: [1,11,2,12,3,13,4,14,5]
Run Code Online (Sandbox Code Playgroud)
Dan*_*kov 55
我想提出一个更加懒惰的合并版本:
merge [] ys = ys
merge (x:xs) ys = x:merge ys xs
Run Code Online (Sandbox Code Playgroud)
对于一个示例用例,您可以查看最近关于延迟生成组合的 SO问题.
接受的答案中的版本在第二个参数中是不必要的严格,这是在这里改进的.
and*_*dri 43
merge :: [a] -> [a] -> [a]
merge xs [] = xs
merge [] ys = ys
merge (x:xs) (y:ys) = x : y : merge xs ys
Run Code Online (Sandbox Code Playgroud)
Ed'*_*'ka 23
那么为什么你认为那么简单(concat.transpose)"还不够"?我假设你尝试过类似的东西:
merge :: [[a]] -> [a]
merge = concat . transpose
merge2 :: [a] -> [a] -> [a]
merge2 l r = merge [l,r]
Run Code Online (Sandbox Code Playgroud)
因此,您可以避免显式递归(与第一个答案相比),但仍然比第二个答案更简单.那有什么缺点呢?
编辑:看看Ed'ka的回答和评论!
另一种可能性
merge xs ys = concatMap (\(x,y) -> [x,y]) (zip xs ys)
Run Code Online (Sandbox Code Playgroud)
或者,如果你喜欢Applicative:
merge xs ys = concat $ getZipList $ (\x y -> [x,y]) <$> ZipList xs <*> ZipList ys
Run Code Online (Sandbox Code Playgroud)