On 01/12/2006, at 6:08 PM, TJ wrote:

First of all, sorry if this is a really silly question, but I couldn't
figure it out from experimenting in GHCi and from the GHC libraries
documentation (or Google).

Is there an IORef consturctor? Or is it just internal to the Data.IORef module?

I want a "global variable", so I did the following:

------
module VirtualWorld where
 import Data.IORef
 theWorld = IORef [] -- This will be writeIORef'ed with a populated
list as the user modifies the world.
-----

It doesn't work. GHCi says that the IORef constructor is not in scope.
I did a ":module Data.IORef" and then "IORef []" and it still gives me
the same error.

I'm using GHC 6.6 on Windows.

Hi TJ,

IORef is an abstract data type, so you cannot refer to its constructors directly.

Instead you must use:

   newIORef :: a -> IO (IORef a)

which will create an IORef on your behalf. Note that the result is in the IO type,
which limits what you can do with it.

If you want a global variable then you can use something like:

   import System.IO.Unsafe (unsafePerformIO)

   global = unsafePerformIO (newIORef [])

But this is often regarded as bad programming style (depends who you talk to). So you should probably avoid this unless it is really necessary (perhaps you could use a state
monad instead?)

Read the comments about unsafePerformIO on this page:

http://www.haskell.org/ghc/docs/latest/html/libraries/base/System- IO-Unsafe.html

especially the notes about NOINLINE and -fno-cse

Cheers,
Bernie.
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to