
On Sat, Feb 28, 2009 at 10:31:37PM +0000, Will Ness wrote:
That's what I understood the OP wanted - Scheme's LET, not LETREC, allowing for shadowing. I was suprised let-statement in do chain didn't work that way. I expected it to be equivalent to a kind of code above, since each new line in do block represents a nested function in explicit bind notation, and nested function binding definitely provides for non-recursive let kind of argument binding, with shadowing.
I thought the whole point of having special let statement in do notation was not to have to write the kind of code above with singleton lists. Since we have shadowing there, it should've been so in let-statements too. Isn't it?
No, the point of let expressions in do-blocks is to have a convenient way to make pure bindings, i.e. ones that aren't piped through >>= . Note that let statements in do-blocks just get desugared into normal let expressions: do { let x = y ; stuff } desugars into let x = y in do { stuff } Haskell simply doesn't have anything equivalent to Scheme's LET, except for actual nested functions. -Brent