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

Reply via email to