[Haskell-cafe] Re: [Haskell] IVar

Jan-Willem Maessen jmaessen at alum.mit.edu
Wed Dec 5 18:15:32 EST 2007

On Dec 5, 2007, at 3:58 AM, Simon Marlow wrote:

> Jan-Willem Maessen wrote:
>>> Consider this:
>>> do
>>>   x <- newIVar
>>>   let y = readIVar x
>>>   writeIVar x 3
>>>   print y
>>> (I wrote the let to better illustrate the problem, of course you  
>>> can inline y if you want).  Now suppose the compiler decided to  
>>> evaluate y before the writeIVar.  What's to prevent it doing  
>>> that?  Nothing in the Haskell spec, only implementation convention.
>> Nope, semantics.  If we have a cyclic dependency, we have to  
>> respect it---it's just like thunk evaluation order in that respect.
> Ah, so I was thinking of the following readIVar:
> readIVar = unsafePerformIO . readIVarIO
> But clearly there's a better one.  Fair enough.

Hmm, so unsafePerformIO doesn't deal with any operation that blocks?   
I'm wondering about related sorts of examples now, as well:

   x <- newIVar
   y <- unsafeInterleaveIO (readIVarIO x)
   writeIVar x 3
   print y

Or the equivalent things to the above with MVars.


> Cheers,
> 	Simon

More information about the Haskell-Cafe mailing list