[Haskell-cafe] why cannot i get the value of a IORef variable ?

Gregory Crosswhite gcross at phys.washington.edu
Thu Oct 22 14:59:01 EDT 2009


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
> <gcross at 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 <dave at zednenem.com>
> <http://www.eyrie.org/~zednenem/>



More information about the Haskell-Cafe mailing list