Yes, I was once taught that "Every time you use unsafePerformIO, God kills a kitten," so every time I consider using it I first ask myself: is this really worth an innocent kitten's life?

Cheers,
Greg

On Oct 22, 2009, at 11:32 AM, David Menendez wrote:

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

Reply via email to