permutations :: [a] -> [[a]] permutations = foldr (\x ac -> ac >>= (fmap . ins x) <*> (enumFromTo 0 . length)) [[]] where ins x xs n = let (a, b) = splitAt n xs in a ++ x : b main :: IO () main = print $ permutations [1, 2, 3]