Haskellで次の方法で2 つのリストをマージする方法がわかりません。
INPUT: [1,2,3,4,5] [11,12,13,14]
OUTPUT: [1,11,2,12,3,13,4,14,5]
Haskellで次の方法で2 つのリストをマージする方法がわかりません。
INPUT: [1,2,3,4,5] [11,12,13,14]
OUTPUT: [1,11,2,12,3,13,4,14,5]
マージの遅延バージョンを提案したい:
merge [] ys = ys
merge (x:xs) ys = x:merge ys xs
ユースケースの一例として、組み合わせの遅延生成に関する最近の SO の質問を確認できます。
受け入れられた回答のバージョンは、2 番目の引数で不必要に厳密であり、それがここで改善されたものです。
merge :: [a] -> [a] -> [a]
merge xs [] = xs
merge [] ys = ys
merge (x:xs) (y:ys) = x : y : merge xs ys
では、単純な (concat . transpose) では「十分ではない」と考えるのはなぜですか? 次のようなことを試したことがあると思います:
merge :: [[a]] -> [a]
merge = concat . transpose
merge2 :: [a] -> [a] -> [a]
merge2 l r = merge [l,r]
したがって、明示的な再帰を(最初の回答と比較して)回避できますが、それでも2番目の回答よりも簡単です。では、欠点は何ですか?
編集:Ed'kaの答えとコメントを見てください!
別の可能性:
merge xs ys = concatMap (\(x,y) -> [x,y]) (zip xs ys)
または、Applicativeが好きな場合:
merge xs ys = concat $ getZipList $ (\x y -> [x,y]) <$> ZipList xs <*> ZipList ys
-- ++
pp [] [] = []
pp [] (h:t) = h:pp [] t
pp (h:t) [] = h:pp t []
pp (h:t) (a:b) = h : pp t (a:b)