main = print $ partitions [1,2,3,4,5,6] partitions :: [a] -> [[[a]]] partitions [] = [[]] partitions (x:xs) = expand x $ partitions xs where expand :: a -> [[[a]]] -> [[[a]]] expand x ys = concatMap (extend x) ys extend :: a -> [[a]] -> [[[a]]] extend x [] = [[[x]]] extend x (y:ys) = ((x:y):ys) : map (y:) (extend x ys)