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))