On 08-08-12 17:27, Ertugrul Söylemez wrote:
Vo Minh Thu <noteed@gmail.com> wrote:

This is not a parsing problem, but a scoping one: try to run this
program:

main = do
  let x = y
      y = 5
  let a = b
  let b = 6
  print (x, y, a, b)

Cheers,
Thu
Martijn has actually covered this question:

Where each sequence of let-less bindings is put in a separate
binding group. I'm no parsing wizard, but I couldn't come up with
any situations in which this would cause ambiguity. To me, the
let-less version is easier on the eyes, more consistent with <-
bindings, and also makes it less of a hassle to move stuff around.

To make it more clear, this is the transformation I propose:

do ...        -- not a let-less binding
   x1 = exp1  -- \
   ..         --  only let-less bindings  
   xn = expn  -- /
   ...        -- not a let-less binding
  
becomes

do ...
   let x1 = exp1
       ..
       xn = expn
   ...
  
So

main = do
  x = y
  y = 5
  a = b
  b = 6
  print (x, y, a, b)


would put everything in the same binding group and compile successfully. To get Thu's example, you would write

main = do
  x = y
  y = 5
  let a = b
  let b = 6
  print (x, y, a, b)

The last let could even be left out.

Cheers, Martijn

The suggestion seems sound to me, and the additional 'let' can really be
annoying in cases where you have a lot of 'let' bindings among very few
monadic actions.  My current way to deal with this is to move the stuff
to separate computations, but it's certainly not a nice solution:

    myComp = c >>= f
        where
        f x = ...
            where
            a = ...
            b = ...


Greets
Ertugrul



_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe