Voglio fare tutte le possibili combinazioni di sottogruppi con 2 elenchi. Ecco una funzione che fa proprio questo:Permutazione di un elenco - Haskell
getCombinations :: [a] -> [[a]]
getCombinations na = do
a <- na
b <- na
[[a,b]]
Se passate "abc" per questa funzione, restituisce questo:
["aa","ab","ac","ba","bb","bc","ca","cb","cc"]
una semplice modifica dello stesso metodo potrebbe tornare combinazioni di 3 liste invece di due.
getCombinations :: [a] -> [[a]]
getCombinations na = do
a <- na
b <- na
c <- na
[[a,b,c]]
Risultato di passaggio "abc" come argomento:
["aaa","aab","aac","aba","abb","abc","aca","acb","acc",
"baa","bab","bac","bba","bbb","bbc","bca","bcb","bcc",
"caa","cab","cac","cba","cbb","cbc","cca","ccb","ccc"]
Qual è il modo più semplice per farlo scalare a un numero arbitrario di liste? Ecco ciò che la dichiarazione del tipo dovrebbe assomigliare:
getCombinations :: Int -> [a] -> [[a]]
Puoi sempre provare a utilizzare hoogle: http://www.haskell.org/hoogle/?hoogle=Int+-%3E+[a]+-%3E+[[a]], restituisce M come terzo risultato. – sdcvvc
Grazie sdcvvc, non sapevo che fosse possibile eseguire una query su hoogle in quel modo! – RooSoft
Tecnicamente, queste sono [Permutazioni] (https://en.wikipedia.org/wiki/Permutation) NON [Combinazioni] (https://en.wikipedia.org/wiki/Combination). I matematici saranno pedanti ... –