[GHC] #10843: Allow do blocks without dollar signs as arguments

GHC ghc-devs at haskell.org
Mon Sep 7 08:00:50 UTC 2015


#10843: Allow do blocks without dollar signs as arguments
-------------------------------------+-------------------------------------
        Reporter:  agibiansky        |                   Owner:  agibiansky
            Type:  feature request   |                  Status:  new
        Priority:  normal            |               Milestone:
       Component:  Compiler          |                 Version:  7.10.2
  (Parser)                           |
      Resolution:                    |                Keywords:
Operating System:  Unknown/Multiple  |            Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |               Test Case:
      Blocked By:                    |                Blocking:
 Related Tickets:                    |  Differential Revisions:  Phab:D1219
-------------------------------------+-------------------------------------
Changes (by simonpj):

 * differential:   => Phab:D1219


Comment:

 I'm not against this, but not wildly in favour either.  It might be
 convenient, but it's another small wrinkle.  Some thoughts

 * Haskell allows
 {{{
    f MkT { x = 3 } y z
 }}}
   meaning
 {{{
   f (MkT {x = 3}) y z
 }}}
   which I have always thought of as a bit of a mistake.  The former looks
 (to my eye) too much like a function call with four argument.

   However, you could argue that the `do` version is less harmful, because
 the initial `do` signals the start of a `do` block, whereas the initial
 `MkT` could be a bare constructor argument.

 * What do you intend for
 {{{
   f x do { blarg } y z
 }}}
   Is that equivalent to this?
 {{{
   f x (do { blarg }) y z
 }}}
   If so, better to say so.

 * Also give an example with layout. So perhaps
 {{{
   f x do p <- ps
          return (p+1)
     z z
 }}}
   is equivalent to
 {{{
   f x (do { p <- ps; return (p+1) }) y z
 }}}
   I think lambda-case is similar.

 * Lambda is different because it does not start implicit layout.  So
 perhaps an un-parenthesised lambda can only appear as the last argument.
 Better say so.

 * If you allow lambda, why not `if`?  And I suppose `case`?
 {{{
   f x if this then that else the_other
 }}}
   means
 {{{
   f x (if this then that else the_other
 }}}
   I suspect that this is a bridge too far, but I think it poses no more
 parsing difficulty than Lambda.  Right?

 * What about infix functions?  I.e. is this ok?
 {{{
    f >>> do blarg
 }}}
   Presumably the `do` binds more tightly than any operator?

 I suggest that you make a wiki page on the GHC Trac to describe the
 extension, along with examples to cover these corner cases, and advertise
 it on the ghc-users list. That might elicit some info about whether people
 would find this useful or not.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10843#comment:10>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list