[Haskell-beginners] Monad operators: multiple parameters

Daniel Fischer daniel.is.fischer at googlemail.com
Tue Jun 7 22:10:27 CEST 2011


On Tuesday 07 June 2011, 19:01:29, aditya siram wrote:
> Also I don't really know how "let"s inside a do block desugars but I'm
> guessing it's simple substitution

Yes.

do let a = b
   foo
   bar

desugars to

let a = b in do { foo; bar; }

(and then further to let a = b in foo >> bar).

A bit more interesting are things like

do x <- foo
   let a = b
   bar

which desugars to

foo >>= \x -> let a = b in bar

and then the compiler may lift the let-binding out of the (>>=) if a) 
that's possible because it doesn't use any values bound in the do-block 
before and b) it's deemed a beneficial transformation (which I think it is, 
so at least with optimisations, I'd expect such lets to be floated out).

> so for example the "main"  function
> below probably translates to:
>    main3 = let suffix = "suffix" in
>                 getLine >>= \x -> return (map toUpper x ++ suffix)
> 
> -deech



More information about the Beginners mailing list