id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc	os	architecture	failure	difficulty	testcase	blockedby	blocking	related
4148	improve new recursive do syntax	guest		"This is a request for an adjustment of the syntax for the new
recursive do notation. ""rec { ... }"" should parse/type check as an expression
such that:

{{{
  mdo
      a <- getChar
      b <- f c
      c <- g b
      putChar c
      return b
}}}

can be written as

{{{
  do rec
      a <- getChar
      b <- f c
      c <- g b
      putChar c
      return b
}}}

at moment the closest you can get is ...

{{{
t5 =
  do rec   
      a <- getChar
      b <- f c
      c <- g b
      putChar c
    return b 
}}}

it seems rec { ... } is a binding construct not an expression and therefore
can not be used in the final position (or sole component) of a do block

benefits
 -  drop in replacement for mdo, that is the construct ""do rec""
  becomes semantically and syntactically equivalent to the mdo
  notation
 - current layout is maintained (which is much neater)
 - I would argue that it is more intuitive


dificulty
 - it seems to be a minor change?.

related
 - this change seems to have been introduced as
   [http://hackage.haskell.org/trac/ghc/ticket/2798]
   somewhat surreptitiously (well, cought me by surprise, anyway.).

== background ==

6.12.1 introduced a change to the recursive do syntax
[http://old.nabble.com/Update-on-GHC-6.12.1-td26103595.html]

Instead of writing

{{{
  mdo
    a <- getChar
    b <- f c
    c <- g b
    putChar c
    return b
}}}

you would write

{{{
  do
    a <- getChar
    rec { b <- f c
          ; c <- g b }
    putChar c
    return b
}}}

A couple of issues about the change:



 - the new syntax spoils layout (see above)
 - migrating to the new syntax with the current limitation is
   non-trivial, requires analysis of code (in some cases).

for the record ...

{{{
> t2 =
>  do rec
>       a <- getChar
>       b <- f c
>       c <- g b
>       putChar c
>       return b

> f = return . (const 'a')
> g = return

eg.lhs:23:6:
    The last statement in a 'do' construct must be an expression
Failed, modules loaded: none.
}}}

"	feature request	closed	low	7.6.1	Compiler	6.12.3	fixed		ryani jvlask@… ross@… iavor.diatchki@… erkokl@… william.knop.nospam@…	Unknown/Multiple	Unknown/Multiple	None/Unknown	Unknown	mdorun004, mdorun005			
