Brian Hulley wrote:
Brian Hulley wrote:
Yitzchak Gale wrote:
I wrote:
Prelude> let f = undefined :: Int -> IO Int
Prelude> f `seq` 42
*** Exception: Prelude.undefined
Prelude> ((>>= f) . return) `seq` 42
42
The monad laws say that (>>= f) . return must be
identical to f.
I thought it was:
return x >>= f = f x
so here the lhs is saturated, so will hit _|_ when the action is
executed just as the rhs will.
Ooops! But that does not mean the equation holds because for example
Prelude> (return 3 >>= f) `seq` 42
42
Prelude> (f 3) `seq` 42
*** Exception: Prelude.undefined
In the lhs you only hit _|_ when the composite (>>=) action is actually
being executed whereas in the rhs you hit _|_ when computing the function
which will return the action to execute so there is difference.
Brian.
--
http://www.metamilk.com
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe