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


_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to