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|.