Quick actions

cmd+k|ctrl+k

Navigation

Languages

StateT Random Generation

Snippet info

Language

Haskell

Visibility

public

Author

homam

Created

2015-12-06T11:11:47Z

Updated

2015-12-06T12:48:15Z

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