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? >
None? Wasn't that Ryan's point, that without the unsafeInterleaveIO, that reordering wouldn't matter, but with it, it does? > jcc _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe