import Data.Bifunctor (second) permutations :: [a] -> [[a]] permutations = let ins x xs n = uncurry (<>) $ second (x :) (splitAt n xs) in foldr ( \x a -> a >>= (fmap . ins x) <*> (enumFromTo 0 . length) ) [[]] main :: IO () main = print $ permutations [1, 2, 3]