On Wed, Jul 10, 2013 at 9:47 AM, <oleg@okmij.org> wrote:

Jon Fairbairn wrote:
> It just changes forgetting to use different variable names because of
> recursion (which is currently uniform throughout the language) to
> forgetting to use non recursive let instead of let.

Let me bring to the record the message I just wrote on Haskell-cafe
        http://www.haskell.org/pipermail/haskell-cafe/2013-July/109116.html

and repeat the example:

In OCaml, I can (and often do) write

        let (x,s) = foo 1 [] in
        let (y,s) = bar x s in
        let (z,s) = baz x y s in ...

In Haskell I'll have to uniquely number the s's:

        let (x,s1)  = foo 1 [] in
        let (y,s2)  = bar x s1 in
        let (z,s3)  = baz x y s2 in ...

and re-number them if I insert a new statement.



Usage of shadowing is generally bad practice. It is error-prone. Hides obnoxious bugs like file descriptors leaks.
The correct way is to give different variables that appear in different contexts a different name, although this is arguably less convenient and more verbose.