
Glynn Clements
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
Jon Cast
participants (1)
-
Jon Cast