Vous pouvez écrire votre fonction pour trois éléments comme l'utilisation tails :: [a] -> [[a]]
:
[x++y++z | (x:xs) <- tails list, (y:ys) <- tails xs, (z:_) <- tails ys]
Cela génère:
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"]
Mais généralement, vous voulez une plus solution évolutive (celui où vous pouvez générer des combinaisons de k éléments). Vous pouvez par exemple définir une fonction combinations :: Int -> [a] -> [[a]]
comme:
combinations 0 _ = [[]]
combinations n ls = [ (x:ys) | (x:xs) <- tails ls, ys <- combinations (n-1) xs ]
et vous devez concat
tous les éléments (par exemple en utilisant un map
).