Writing for both State and StateT

Mark T.B. Carroll Mark.Carroll@Aetion.com
Tue, 22 Apr 2003 07:48:57 -0400 (EDT)


At the moment I have code like,


next_random_probability :: (RandomGen g, Num a, Random a) => State g a

next_random_probability =
    do old_rng <- get
       let (random_probability, new_rng) = randomR (0, 1) old_rng
       put new_rng
       return random_probability

next_random_probabilityT :: (RandomGen g, Num a, Random a, Monad m) => StateT g m a

next_random_probabilityT =
    do old_rng <- get
       let (random_probability, new_rng) = randomR (0, 1) old_rng
       put new_rng
       return random_probability


Because these just use get and put which are both from MonadState, is it
possible to write just one next_random_probability with a more general
type signature, maybe mentioning MonadState, or at least two wrappers that
call the same worker function, so that the same code is good for both
State and StateT?

-- Mark