
Bertram Felgenhauer:
unsafeInterleaveSequence :: [IO a] -> IO [a] unsafeInterleaveSequence [] = return [] unsafeInterleaveSequence (x:xs) = unsafeInterleaveIO $ liftM2 (:) x (unsafeInterleaveSequence xs)
randomInts = unsafeInterleaveSequence $ repeat randomIO
I took a peek at GHC's Random.hs to get an idea of how "unsafe" this approach might be. I see that theStdGen is stored in an IORef, and that newStdGen and getStdGen are implemented in terms of the unsynchronised getStdGen and setStdGen. I guess this allows a race condition in which randomIO and friends could return duplicate random numbers in different threads? Something like this might be better:
getStdRandom f = atomicModifyIORef theStdGen (swap . f) where swap (v,g) = (g,v) newStdGen = atomicModifyIORef theStdGen split
Now let's see if I can figure out how to submit my first patch...