
On Sun, 2009-03-15 at 18:11 -0700, Ryan Ingram wrote:
On Sun, Mar 15, 2009 at 1:56 PM, Jonathan Cast
wrote: But not if you switch the (x <- ...) and (y <- ...) parts:
main = do r <- newIORef 0 v <- unsafeInterleaveIO $ do writeIORef r 1 return 1 y <- readIORef r x <- case f v of 0 -> return 0 n -> return (n - 1) print y
Now the IORef is read before the case has a chance to trigger the writing.
But if the compiler is free to do this itself, what guarantee do I have that it won't?
You don't really have any guarantee; the compiler is free to assume that v is a pure integer and that f is a pure function from integers to integers. Therefore, it can assume that the only observable affect of calling f v is non-termination. Note that unsafeInterleaveIO *breaks* this assumption;
[Ignored; begging the question] jcc