[Haskell-cafe] STM and random numbers

Rich Neswold rich.neswold at gmail.com
Fri Jan 12 14:35:00 EST 2007


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).

-- 
Rich

AIM : rnezzy
ICQ : 174908475


More information about the Haskell-Cafe mailing list