import System.Random rnd_permu :: [a] -> IO [a] rnd_permu [] = return [] rnd_permu (x:xs) = do rand <- randomRIO (0, (length xs)) rest <- rnd_permu xs return $ let (ys,zs) = splitAt rand rest in ys++(x:zs)