[Haskell-cafe] Re: [Haskell] IVar
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:
>>> 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
Or the equivalent things to the above with MVars.
More information about the Haskell-Cafe