[Haskell] IO Regions in Haskell98

oleg at pobox.com oleg at pobox.com
Tue Jan 24 04:20:00 EST 2006

Simon Peyton-Jones wrote:
> Don't side effects kill you?
> 	withFile "foo" (\q -> writeIORef var q)

No. Computations within the body of |withFile| must be within the
|IOM| monad. These computations are built from |unit| and those
computations exported from IORegions98 that are deemed safe. There is
no lift function from IO to the IOM monad, as any such generic
function will indeed be unsafe. Currently IORegions98 does not export
any writeIORef-like operation in the IOM monad. We can do so, if we
wish. But in that case, we must obey the safety invariant and define
this function as:

	qWriteIORef :: Typeable a => IORef a -> a -> IOM mark ()

That precludes storing of Qhandles or IOM computations.

> So would unsafePerformIO
> 	withFile "foo" (\q -> return (unsafePerformIO (qGetChar q)))

with unsafePerformIO (or related unsafeCoerce), all things are
possible. They are Alpha and Omega (probably, more of the latter...)

But even then, one cannot apply unsafePerformIO to (qGetChar q)
because the type of (qGetChar q) is |IOM mark Char| rather than just
|IO Char|.

More information about the Haskell mailing list