[Haskell] threading mutable state through callbacks

Sven Panne Sven.Panne at aedion.de
Fri Oct 8 14:17:57 EDT 2004


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, just look for NOINLINE
    pragmas in the following files:     :-]

       http://cvs.haskell.org/cgi-bin/cvsweb.cgi/fptools/libraries/GLUT/Graphics/UI/GLUT/Callbacks/Registration.hs?rev=1.12
       http://cvs.haskell.org/cgi-bin/cvsweb.cgi/fptools/libraries/GLUT/Graphics/UI/GLUT/Menu.hs?rev=1.13
       http://cvs.haskell.org/cgi-bin/cvsweb.cgi/fptools/ghc/compiler/HsVersions.h?rev=1.35

Cheers,
    S.


More information about the Haskell mailing list