
On Sat, Dec 11, 2010 at 01:48:36AM +0000, Amy de Buitléir wrote:
And I'd really like to try using RandT, because this seems like the right situation for it. This compiles just fine.
pushRandom3 :: (RandomGen g) => RandT g (State Stack) () pushRandom3 = do xs <- get r <- getRandomR (1,100) put (r:xs)
Indeed, this is the right way to do it!
But I don't know if it works, because I can't figure out the magic incantation to get it to run!
Let's look at the type of evalRandT: *Main Control.Monad.Random> :t evalRandT evalRandT :: (Monad m, RandomGen g) => RandT g m a -> g -> m a So we have: *Main Control.Monad.Random> :t evalRandT pushRandom3 evalRandT pushRandom3 :: (RandomGen g) => g -> State Stack () Let's pass it a generator: *Main Control.Monad.Random> :t evalRandT pushRandom3 (mkStdGen 0) evalRandT pushRandom3 (mkStdGen 0) :: State Stack () (Note, if you use mkStdGen 0 you will get the same random numbers every time you run your program; instead you could use getStdGen to get one based on the system clock or something like that.) Now we have a State computation, so let's run it: *Main Control.Monad.Random> :t execState (evalRandT pushRandom3 (mkStdGen 0)) execState (evalRandT pushRandom3 (mkStdGen 0)) :: Stack -> Stack *Main Control.Monad.Random> :t execState (evalRandT pushRandom3 (mkStdGen 0)) [1,2,3,4,5] execState (evalRandT pushRandom3 (mkStdGen 0)) [1,2,3,4,5] :: Stack -Brent