
15 Mar
2009
15 Mar
'09
4:43 p.m.
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.