import Data.List (groupBy, nub, permutations, sortBy) group' :: [Int] -> [a] -> [[[a]]] group' ln ls = map ((([([fst] <*>)] <*>) . groupBy grouper . sortBy sorter) . zip ls) (nub (permutations placers)) where placers = concatMap (uncurry replicate) (zip ln [0 ..]) sorter (_, r1) (_, r2) = r1 `compare` r2 grouper (_, r1) (_, r2) = r1 == r2 group3 :: [a] -> [[[a]]] group3 = group' [2, 3, 4]