[Haskell-cafe] why cannot i get the value of a IORef variable ?

Thomas DuBuisson thomas.dubuisson at gmail.com
Thu Oct 22 13:41:39 EDT 2009


> For clarity, one trick that uses "unsafePerformIO" which you may have seen
> posted on this list earlier today is the following way of creating a
> globally visible IORef:
>
> import Data.IORef
> import System.IO.Unsafe
>
> *** counter = unsafePerformIO $ newIORef 0 ***
>
> next = do
>  modifyIORef counter (+1)
>  readIORef counter

This is still unsafe but it can evidently be slightly improved with
NOINLINE pragma:

    {-# NOINLINE counter #-}
    counter = unsafePerformIO $ newIORef 0

without said pragma the counter could be initialized numerous times,
as I understand it.  All this said, I hope people avoid
unsafePerformIO for mutable globals - reader monad, state monad, and
partial application should be sufficient tools.

Thomas


More information about the Haskell-Cafe mailing list