
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