hoge :: forall a i e. (IArray a e, Ix i, Random i) => a i e -> StdGen -> (a i e, StdGen) hoge ia gi = runST act where act :: forall s. ST s (a i e, StdGen) act = do ma <- thaw ia let _ = ma :: STArray s i e g' <- shuffle ma gi (range bo) ra <- unsafeFreeze ma return (ra, g') bo@(_, last) = bounds ia shuffle a g [] = return g shuffle a g (i:is) = do let (j, g') = randomR (i, last) g x <- readArray a i y <- readArray a j writeArray a i y writeArray a j x shuffle a g' is