[Haskell-cafe] What unsafeInterleaveIO is unsafe
Daniel Fischer
daniel.is.fischer at web.de
Sun Mar 15 16:43:01 EDT 2009
Am Sonntag, 15. März 2009 21:25 schrieb Jonathan Cast:
> On Sun, 2009-03-15 at 13:02 -0700, Ryan Ingram wrote:
>
> > Furthermore, due to the monad laws, if f is total, then reordering the
> > (x <- ...) and (y <- ...) parts of the program should have no effect.
> > But if you switch them, the program will *always* print 0.
>
> I'm confused. I though if f was strict, then my program *always*
> printed 1?
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.
More information about the Haskell-Cafe
mailing list