#4148: improve new recursive do syntax
---------------------------------+------------------------------------------
Reporter: guest | Owner:
Type: feature request | Status: new
Priority: normal | Component: Compiler
Version: 6.12.3 | Keywords:
Os: Unknown/Multiple | Testcase:
Architecture: Unknown/Multiple | Failure: None/Unknown
---------------------------------+------------------------------------------
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.
}}}
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/4148>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs