On Tue, May 20, 2014 at 9:27 PM, silvio <silvio.frischi@gmail.com> wrote:
>     4) res <- fmap pureFunction ioFunction === let res = pureFunction {
>     ioFunction}
>
>
> From a distance, let and monadic bind are just different forms of name
> binding.
>
> But haskell's let has an effectlessness that makes it declaratively
> different from its cousin in, say, ocaml.
>
> This is no small change you're proposing.

You might have misunderstood. The 'let' in the do notation is already
different from the normal 'let' in that it doesn't have an 'in' for
example. {} should of course only work inside a do block.

But you know about the desugaring for let statements within do blocks, yes?

There's nothing magical about let. Which is to say, there's a regularity about let that current haskell allows us to take for granted. What you're proposing makes the let in a do-block different from a let 'in' a do-block, braces notwithstanding i.e.

do
   let ... { ... }

vs

do
   let ... in
  
So to return to this:

>     4) res <- fmap pureFunction ioFunction === let res = pureFunction {
>     ioFunction}

If res in "let res = ..." is not referred to anywhere in the do-block created by desugaring, it's as if the let didn't exist.

On the other hand, for "res <- ... ioFunction", the effect of ioFunction is realized regardless of whether res is referenced.

-- Kim-Ee