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... _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe