整数の 2 つのリストを取り、2 つのリストから交互に取得された要素を含むリストを生成する haskell 関数を作成しようとしています。
私は機能を持っています:
blend xs ys
例:
blend [1,2,3] [4,5,6]
戻るべき
[1,4,2,5,3,6]
私のロジックは、2 つのリストをまとめて圧縮し、代替要素のペアを生成してから、何らかの方法でそれらをタプルから削除することです。
実装方法がわからないタプルからそれらを削除しています。
整数の 2 つのリストを取り、2 つのリストから交互に取得された要素を含むリストを生成する haskell 関数を作成しようとしています。
私は機能を持っています:
blend xs ys
例:
blend [1,2,3] [4,5,6]
戻るべき
[1,4,2,5,3,6]
私のロジックは、2 つのリストをまとめて圧縮し、代替要素のペアを生成してから、何らかの方法でそれらをタプルから削除することです。
実装方法がわからないタプルからそれらを削除しています。
再帰降下中に引数を交換するのはどうですか?
blend (x:xs) ys = x:(blend ys xs)
blend _ _ = []
任意の数のリストに対してこのアプローチを一般化することもできます (これはお任せします)。または、リストの残りの要素が空の場合は、リストの残りの要素を取得することもできます。
blend _ ys = ys
圧縮する場合は、タプルの代わりにリストを生成します。
concat $ zipWith (\x y -> [x,y]) [1,2,3] [4,5,6]
無意味な楽しみ:
concat $ zipWith ((flip(:)).(:[])) [1,2,3] [4,5,6]
おそらく最も簡単な方法:
import Data.List
concat $ transpose [[1,2,3],[4,5,6]]
これは宿題だと思います。(あなたが言ったように)次のリストを作成できるという条件で:
[(1,4),(2,5),(3,6)]
...あなたは2つの機能でそれを解決することができます:
(a, b)
タプルをリストに変換する必要があります[a, b]
。パターンマッチングを使ってみてください!この関数は、リストのすべての要素に適用(マッピング)する必要があります。[[1,4],[2,5],[3,6]]
ので、サブリストを1つの大きなリストに連結するための関数が必要です。もちろん、この問題を解決する他の、おそらく優れた方法がありますが、元のアプローチを継続することをお勧めします。
concat
または明示的な再帰を使用しないソリューション:
blend l = foldr($)[] . zipWith(.) (map(:)l) . map(:)
これをポイントフリーにすることもできます
blend' = (foldr($)[].) . (.map(:)) . zipWith(.) . map(:)
\[1,2,3] [4,5,6] -> [1:, 2:, 3:] [4:, 5:, 6:]
次に、これを関数合成と一緒に圧縮します
-> [(1:).(4:), (2:).(5:), (3:).(6:)]
そして最後に、これらすべての構成の適用を右から空のリストに折り畳みます
-> (1:).(4:) $ (2:).(5:) $ (3:).(6:) $ [] = 1:4:2:5:3:6:[] = [1,4,2,5,3,6]