[Haskell-cafe] STM and random numbers
Sebastian Sylvan
sebastian.sylvan at gmail.com
Fri Jan 12 16:05:21 EST 2007
On 1/12/07, Rich Neswold <rich.neswold at gmail.com> wrote:
> On 1/12/07, Chad Scherrer <chad.scherrer at gmail.com> wrote:
> > Even if I use randomIO outside the STM code, I don't know of a (safe)
> > way to bring it in.
>
> Define your STM action to be (Int -> STM s). Generate the random
> number and then pass it in:
>
> mySTM :: Int -> STM a
> mySTM n = do { ... }
>
> To use it:
>
> do { n <- getStdRandom (...)
> ; atomically (mySTM n) }
>
> > Anyway, the number of random values needed depends
> > on other stuff going on within the STM part.
>
> Ah. This detail removes my suggestion. But how about this?
>
> randomizer :: TMVar Int -> IO ()
> randomizer v = do { n <- getStdRandom (...)
> ; atomically (putTMVar v n)
> ; randomizer v }
>
> Start the randomizer action using forkIO. This gives you a steady
> supply of random numbers in the STM monad just by reading the TMVar
> (via takeTMVar).
Rather than having a separate thread computing the random numbers
using IO, why not just stick an StdGen in a TVar and write a function
like:
type RandomVar = TVar StdGen
rnd :: RandomVar -> STM a
rnd var = do
g <- readTVar var
let (r,g') = random g
writeTVar var g'
return r
--
Sebastian Sylvan
+46(0)736-818655
UIN: 44640862
More information about the Haskell-Cafe
mailing list