[Haskell] threading mutable state through callbacks

Simon Marlow simonmar at microsoft.com
Mon Oct 11 11:03:11 EDT 2004

On 08 October 2004 19:18, Sven Panne wrote:

> Jules Bean wrote:
>> [...] Unfortunately, it's not going to work. It's not going to work
>> because some of the procedures take callbacks, and the callbacks are
>> values of type IO (). I can see two solutions to this:
>> a) revert to using an IORef [...]
>> b) write the callbacks as values of type StateT Env IO () [...]
> or
> c) Give up any hope of clean semantics and simply use a common hack
> like: 
>        {-# NOINLINE myGlobalVar #-}
>        myGlobalVar :: IORef Int
>        myGlobalVar = unsafePerformIO (newIORef 0)
>     My GLUT binding does it happily, as does GHC itself, [snip]

I'd like to add that while the implementation might be a little unsafe,
there's no problem in principle with the semantics of top-level IORefs.
We could add such a thing as a GHC extension, but it would be nice if it
were an instance of a more general-purpose extension.


More information about the Haskell mailing list