[Haskell-cafe] Re: Why does RandomIO need the unsafePerformIO hack?

Keean Schupke k.schupke at imperial.ac.uk
Fri Dec 3 06:14:41 EST 2004

randomIO needs the unsafePerformIO hack because it does not return the 
seed... however it can be rewritten:

    getRandomIO :: Int -> IO (IO Int)
    getRandomIO x_init = do
       x <- newIORef x_init
       return (randomIO x)

       randomIO :: IORef Int -> IO Int
       randomIO r = do -- where f & g generate the pseudo-random sequence
          x <- readIORef r
          writeIORef r (f x)
          return (g x)

The difference is in the API to use this version you would have to
pass the generator around:

    main :: IO ()
    main = do
       rio <- getRandomIO
       test rio

    test :: IO Int -> IO ()
    test rio = do
       x <- rio
       putStrLn (show x)

with randomIO the seed is in a 'global' variable... of course if you 
want a sequence
outside of the IO monad... both versions can be used to generate a lazy 

    getRandomList :: IO Int -> IO [Int]
    getRandomList rio = do
       r0 <- rio
       rs <- getRandomList rio
       return (r0:rs)


Graham Klyne wrote:

> Looking at the wiki summary [1] (very good, BTW), I have a question  
> (I've skipped much of the debate, so please just give a message 
> pointer if I missed something).
> Why does RandomIO need to use the unsafePerformIO hack if its already 
> in the IO monad?
> BTW, if the goal is to have a random number generator as a pure 
> (non-IO) function, I *do* think there's a reasonable semantic 
> objection here.
> I'd also like to request that some reference links are added for some 
> of the proposed solutions:
>   2b - reference to stToIO
>   3 - reference  to Data.Dynamic, and how a dictionary of types can be 
> used to provide global variables.
> #g
> -- 
> [1] http://haskell.org/hawiki/GlobalMutableState
> ------------
> Graham Klyne
> For email:
> http://www.ninebynine.org/#Contact
> _______________________________________________
> Haskell-Cafe mailing list
> Haskell-Cafe at haskell.org
> http://www.haskell.org/mailman/listinfo/haskell-cafe

More information about the Haskell-Cafe mailing list