combination :: Int -> [a] -> [[a]] combination 0 _ = [[]] combination _ [] = [] combination c (x:xs) = (map (x:) (combination (c-1) xs)) ++ (combination c xs) group :: [Int] -> [a] -> [a] group [] xs = [[xs]] group (n:ns) xs = map ((combination n) . head) group (n:ns) xs