On Thu, Oct 22, 2009 at 2:23 AM, Gregory Crosswhite <gcr...@phys.washington.edu> wrote: > 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 <d...@zednenem.com> <http://www.eyrie.org/~zednenem/> _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe