On 6 Feb 2009, at 4:20 am, Gregg Reynolds wrote:
However, consider:
getChar >>= \x -> getChar
An optimizer can see that the result of the first getChar is
discarded and replace the entire expression with one getChar without
changing the formal semantics.
But the result of the first getChar is *NOT* discarded.
**As an analogy**, think of the type IO t as (World -> (t,World))
for some hidden type World, and
getChar w = (c, w')
-- get a character c out of world w somehow,
-- changing w to w' as you go
(f >>= g) w = let (v,w') = f w in (g v) w'
In this analogy, you see that the result of getChar is a value of
type IO Char (not of type Char), and that while the character
part of the result of performing the result of getChar may be
discarded, the "changed world" part is NOT.
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe