[Haskell-cafe] evaluation semantics of bind

wren ng thornton wren at freegeek.org
Tue Feb 10 20:59:16 EST 2009


Alberto G. Corona wrote:
> forwarded:
> 
> Yes!  if no state is passed, the optimization makes sense and the term is
> not executed, like any lazy evaluation. For example, I used the debugger
> (that is, without optimizations) to verify it with the Maybe monad:
> op x= x+x
> 
> print $ Just (op 1) >>= \y-> return (Just 2)
> 
> does not evaluate  op 1

Presumably you mean?: print $ Just (op 1) >>= \y-> return 2


> but
> 
> print $ Just (op 1) >>= \y-> return y
> 
> does execute it.


Dashing off towards the White Knight, we should be careful what is said 
here. If we take only the expression "Just (op 1) >>= \y-> return y" 
then evaluating it yields "Just (op 1)". That is, it only evaluates to 
WHNF and does not evaluate what's inside. It is only once this value is 
subsequently handed off to print or some other function, that it may 
become evaluated.

Similarly with the first example as originally written. It so happens 
that bind is non-strict for the field in Just, so we can discard the "op 
1". However, according to the semantics we do not evaluate "Just 2" 
either; we only need to evaluate the return which will produce Just and 
pass the operand down. (Regardless of the fact that the value yielded by 
applying Just to 2 is Just 2. Expressions and their denotations are 
different.)

-- 
Live well,
~wren


More information about the Haskell-Cafe mailing list