[Haskell] Re: Initialisation without unsafePerformIO

Ashley Yakeley ashley at semantic.org
Fri Jun 4 03:35:14 EDT 2004


In article <20040601163515.GA8357 at momenergy.repetae.net>,
 John Meacham <john at repetae.net> wrote:

> I am a fan of allowing top level declarations of the form:
> 
> foo <- newIORef "foo"
> 
> which would behave as an initializer, with the semantics being that it
> be evaluated at most once before foos first use. (so it could be
> implemented via unsafePerformIO or as an init section run before main).
> 
> The 
> {-# NOINLINE foo #-}
> foo = unsafePeformIO $ newIORef "foo"
> 
> idiom is so common and useful, it should have some compiler support. It
> is 'clean' too, since all we are doing is extending the "world" with new
> state, but in a much cleaner/safer way then writing to a file or environment
> variable or other methods of storing state in the world.

Clean it is not:

foo :: a
foo <- newIORef undefined

writeChar :: Int -> IO ()
writeChar x = writeIORef foo x

readString :: IO String
readString = readIORef foo

cast :: Char -> IO String
cast c = (writeChar c) >> readString

-- 
Ashley Yakeley, Seattle WA



More information about the Haskell mailing list