07/01/11 23:19:28
まちがってた。
{-# OPTIONS_GHC -fglasgow-exts #-}
module Test where
import System.Random
import Data.Array.IArray
import Data.Array.ST
import Control.Monad.ST
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