[Haskell-cafe] What unsafeInterleaveIO is unsafe
daniel.is.fischer at web.de
Sun Mar 15 17:09:56 EDT 2009
Am Sonntag, 15. März 2009 21:56 schrieb Jonathan Cast:
> On Sun, 2009-03-15 at 21:43 +0100, Daniel Fischer wrote:
> > 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.
> But if the compiler is free to do this itself, what guarantee do I have
> that it won't?
Wasn't that Ryan's point, that without the unsafeInterleaveIO, that reordering
wouldn't matter, but with it, it does?
More information about the Haskell-Cafe