[Haskell-beginners] Combining the Rand and State monads

Brent Yorgey byorgey at seas.upenn.edu
Thu Apr 5 19:52:47 CEST 2012

On Thu, Apr 05, 2012 at 10:42:20AM +0000, Amy de Buitléir wrote:
> I'm trying to develop a very simple simulation framework. A simulation consists
> of a list of models. Models generate output events based on an input event. Here
> is what I have currently (it works fine).
> modelT :: Model g
> modelT _ = do
>   s <- get
>   put $ s ++ " R"
>   return [n]

I assume you are using the MonadRandom package?  Getting a random
number is as simple as doing something like "getRandomR ('A','Z')" (or
using any other method from the MonadRandom class [1]).  There is an
instance MonadRandom m => MonadRandom (StateT s m), so calls to
getRandom, getRandomR, etc. are automatically lifted into your Model

Your problem seems to be the type you have given to modelT: it claims
that it will work for *any* type g but this is not so; g must
represent a pseudorandom number generator.  This works:

modelT :: RandomGen g => Model g
modelT _ = do
  s <- get
  put $ s ++ " R"
  n <- getRandomR ('A', 'Z')
  return [n]


[1] http://hackage.haskell.org/packages/archive/MonadRandom/0.1.6/doc/html/Control-Monad-Random-Class.html

More information about the Beginners mailing list