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

Reply via email to