[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:

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

Or the equivalent things to the above with MVars.

-Jan

>
>
> Cheers,
> 	Simon
>



More information about the Haskell-Cafe mailing list