28

Haskellで次の方法で2 つのリストをマージする方法がわかりません。

INPUT:  [1,2,3,4,5] [11,12,13,14]

OUTPUT: [1,11,2,12,3,13,4,14,5]
4

6 に答える 6

65

マージの遅延バージョンを提案したい:

merge [] ys = ys
merge (x:xs) ys = x:merge ys xs

ユースケースの一例として、組み合わせの遅延生成に関する最近の SO の質問を確認できます。
受け入れられた回答のバージョンは、2 番目の引数で不必要に厳密であり、それがここで改善されたものです。

于 2010-10-21T12:01:41.327 に答える
51
merge :: [a] -> [a] -> [a]
merge xs     []     = xs
merge []     ys     = ys
merge (x:xs) (y:ys) = x : y : merge xs ys
于 2010-10-14T23:50:47.720 に答える
25

では、単純な (concat . transpose) では「十分ではない」と考えるのはなぜですか? 次のようなことを試したことがあると思います:

merge :: [[a]] -> [a]
merge = concat . transpose

merge2 :: [a] -> [a] -> [a]
merge2 l r = merge [l,r]

したがって、明示的な再帰を(最初の回答と比較して)回避できますが、それでも2番目の回答よりも簡単です。では、欠点は何ですか?

于 2010-10-15T12:08:05.960 に答える
6

編集: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
于 2010-10-15T11:08:00.930 に答える
-1
-- ++
pp [] [] = []
pp [] (h:t) = h:pp [] t
pp (h:t) [] = h:pp t []
pp (h:t) (a:b) = h : pp t (a:b)
于 2012-05-07T09:03:27.273 に答える