Glynn Clements <[EMAIL PROTECTED]> wrote:
> Pavel G. Zhbanov wrote:
> > Is it even possible to make a "global variable" in Haskell? If yes,
> > how?
> The usual fudge is:
> import IORef
> import IOExts
> globalVar :: IORef Int
> globalVar = unsafePerformIO $ newIORef 0
> However, beware of creating more than one "global variable" of the
> same type. If you enable optimisation, common subexpression
> elimination may result in both names referring to the same IORef.
Is this true? It seems wrong---I don't think expressions involving
unsafePerformIO should be combined, for precisely this reason.
Even if it is true, though, the following kludge should work:
> {-# NOINLINE mkGlobalVar #-}
> mkGlobalVar :: String -> alpha -> IORef alpha
> mkGlobalVar name value = usafePerformIO (newIORef value)
> globalVar = mkGlobalVar "globalVar" 0
This ensures that no common sub-expression elimination will be
performed.
> --
> Glynn Clements <[EMAIL PROTECTED]>
Jon Cast
_______________________________________________
Haskell-Cafe mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell-cafe