import System.Random
import Control.Monad.Trans
import Control.Monad.Trans.State
import Control.Monad.Identity
import qualified Control.Monad.State as S
type Eval a g = StateT (g Identity) a
runEval :: (RandomGen g) => g -> StateT g Identity a -> (a, g)
runEval g f = runIdentity $ runStateT f g
rand :: (RandomGen g, Random a, S.MonadState g m) => a -> a -> m a
rand lo hi = do
g <- S.get
let (i, g') = randomR (lo, hi) g
S.put g'
return i
mrand :: (RandomGen g, Random a, S.MonadState g m) => a -> a -> m [a]
mrand lo hi = replicateM 10 $ rand lo hi
main :: IO ()
main = do
g <- newStdGen
print $ runEval g (mrand (1::Integer) (10::Integer))