
On Thu, Oct 22, 2009 at 2:23 AM, Gregory Crosswhite
For clarity, one trick that uses "unsafePerformIO" which you may have seen posted on this list earlier today is the following way of creating a globally visible IORef:
import Data.IORef import System.IO.Unsafe
*** counter = unsafePerformIO $ newIORef 0 ***
Danger! If the monomorphism restriction is disabled, this ends up
creating a value of type forall a. Num a => IORef a, which can be used
to break type safety.
More generally,
cell :: IORef a
cell = unsafePerformIO $ newIORef undefined
unsafeCoerce :: a -> b
unsafeCoerce x = unsafePerformIO $ do
writeIORef cell x
readIORef cell
This way lies segmentation faults. That "unsafe" is there for a reason.
--
Dave Menendez