On Jan 12, 2007, at 10:58 AM, Chad Scherrer wrote:

Hi,

I'd like to be able to use randomIO, but I'm working within the
context of STM. Is there a way to get these working together happily?

For now, I guess I could kludgingly use unsafePerformIO inside STM
(it's the other way around that's not allowed, right?), but I would
need to be sure it doesn't get inlined.

Humm... I'd actually suggest you stop trying to break the rules, and use the portion of the random interface that doesn't require IO. You can pretty easily wrap a StdGen using StateT, and write your stuff in the monad (StateT StdGen STM).

Or, (and I'm amazed this hasn't been done before), you can create a custom random monad that wraps up this behavior. Prototype attached. Now you can write in (RandT StdGen STM), and use the convenient getRandom method.

Invoke like:

dostuff :: IO ()
dostuff = do
    gen <- newStdGen
    x <- atomically (evalRandT stuff gen)
    process x

stuff :: RandT StdGen STM Int
stuff = do
     r <- getRandom
     lift (someSTMaction r)



Thanks,

Chad


Rob Dockins

Speak softly and drive a Sherman tank.
Laugh hard; it's a long way to the bank.
          -- TMBG


Attachment: Random.hs
Description: Binary data


_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to