David Brown wrote:
Dave Tapley wrote:

This code show a trivial case where randomness (and hence the IO
monad) is not used and the first 10 elements of the produced list
are printed:

You don't need the IO monad to achieve pseudy-randomness.  Why not use
'randoms' from System.Random (or 'randomRs' for a range).

  take 10 $ (randomRs (1,6) (mkStdGen 1)) :: [Int]
The other possibility, which would work better in a non-toy problem, is to encapsulate the random numbers in a state monad. That way, rather than using the IO monad (with all its complexity) you can just have a monad of randomness (along with a Bag of Holding and a +2 sword). The trick is to use the split operation when you need to do something lazy. "split" forks the generator into two generators, so you can use one as the generator in your lazy stream and the other for the next step in your random computation.

Or you could use "Gen" from Test.QuickCheck, which basically does this already.

The Wikibook chapter on random numbers explains this.

Paul.
_______________________________________________
Haskell mailing list
Haskell@haskell.org
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to