Eqのインスタンスでないといけないのが微妙。
comb.hs
module Comb wherecomb :: Eq a => Int -> [a] -> [[a]]comb n xs = comb' n [([], xs)] where comb' :: Eq a => Int -> [([a],[a])] -> [[a]] comb' 0 tuples = map fst tuples comb' count tuples = comb' (count-1) $ flatten $ map shift tuples where shift :: Eq a => ([a], [a]) -> [([a], [a])] shift tuple = let (acc, rest) = tuple in [ (x:acc, filtered) | x <- rest, let filtered = filter (/=x) rest ]flatten :: [[a]] -> [a]flatten xs = foldl (++) [] xs```
```bash
*Comb> comb 3 "abcd"
["cba","dba","bca","dca","bda","cda","cab","dab","acb","dcb","adb","cdb","bac","dac","abc","dbc","adc","bdc","bad","cad","abd","cbd","acd","bcd"]