On Fri, Jun 04, 2004 at 12:35:14AM -0700, Ashley Yakeley wrote:
> In article <[EMAIL PROTECTED]>,
> John Meacham <[EMAIL PROTECTED]> 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
Yeah, such an extension would need to ensure initializers are monomorphic. another
advantage of a special syntax rather than unsafePerformIO.
John
--
John Meacham - ârepetae.netâjohnâ
_______________________________________________
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell