A good exercise will be to re-implement State, and then use it. Take a look here: http://en.wikibooks.org/wiki/Haskell/Understanding_monads/State.
This link will take you to a tutorial that takes you through the implementation of State, and then uses it for random number generation.

Hope this helps. Enjoy !

On 18 April 2015 at 00:55, Thomas Jakway <tjakway@nyu.edu> wrote:
I'm having some trouble using the state monad with a random number generator.

I'm trying to follow the LYAH example (http://learnyouahaskell.com/for-a-few-monads-more) but apparently the state monad API has changed, so I'm using Control.Monad.Trans.State.Lazy (state monad from the transformers package).  Side question: is using transformers a good idea?  I've heard some people complain about mtl's performance, others don't seem to care.  I'm far too new to be able to judge anything (does it even make sense to compare transformers vs. mtl?) but if one has overtaken the other I'd rather use that.

Here's what I currently have:
import Control.Monad.Trans.State.Lazy
type GeneratorState = State StdGen

genThree :: Int -> GeneratorState Int
genThree listMax = do --highest index in the list
        let listMin = 0 :: Int --lowest index in the list
        generator <- get
        let (generatedMin, state) = randomR (listMin, listMax) generator
        return generatedMin

Although it typechecks it doesn't seem like an improvement over just using StdGen by itself.

What I think I should have:
genThree :: Int -> GeneratorState Int
genThree listMax = do --highest index in the list
        let listMin = 0 :: Int --lowest index in the list
        generatedMin <- state randomR (listMin, listMax)
        return generatedMin

I feel like I really botched this--what am I missing?


_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners




--
Regards

Sumit Sahrawat