On 1/12/07, Rich Neswold <[EMAIL PROTECTED]> wrote:
On 1/12/07, Chad Scherrer <[EMAIL PROTECTED]> 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
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to