N
: 要素の3つの要素の順序付けられたすべての組み合わせ、つまり["A","B","C","D"]
- >["ABC","ABD","ACD","BCD"]
を取得しようとしています。集合Nからのk要素の組み合わせ
私は私はそれをどのように行うだろう[ x++y++z | pos(x)in list < pos(y) in list < pos(z) in list ]
のようなものを書くことについて考えましたか?
N
: 要素の3つの要素の順序付けられたすべての組み合わせ、つまり["A","B","C","D"]
- >["ABC","ABD","ACD","BCD"]
を取得しようとしています。集合Nからのk要素の組み合わせ
私は私はそれをどのように行うだろう[ x++y++z | pos(x)in list < pos(y) in list < pos(z) in list ]
のようなものを書くことについて考えましたか?
あなたはtails :: [a] -> [[a]]
を使用してのようなの要素のためにあなたの関数を書くこともできます。これは、生成
[x++y++z | (x:xs) <- tails list, (y:ys) <- tails xs, (z:_) <- tails ys]
:
Prelude> :m Data.List
Prelude Data.List> (\list -> [x++y++z | (x:xs) <- tails list, (y:ys) <- tails xs, (z:_) <- tails ys]) ["A","B","C","D"]
["ABC","ABD","ACD","BCD"]
しかし、通常、あなたが(もっとスケーラブルなソリューションをしたい1することができますがk要素の組み合わせを生成します)。あなたは、インスタンスのためのような機能combinations :: Int -> [a] -> [[a]]
を定義することができます。
combinations 0 _ = [[]]
combinations n ls = [ (x:ys) | (x:xs) <- tails ls, ys <- combinations (n-1) xs ]
、その後、あなたはconcat
に(map
を使用して、インスタンスのための)すべての要素を持っています。そこ
あなたが行く:
今combinations 0 lst = [[]]
combinations k lst = do
(x:xs) <- tails lst
rest <- combinations (n-1) xs
return $ x : rest
、あなたが望む結果を得るために、map concat (combinations 3 ["A","B","C","D"])
を使用しています。