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

GHC ghc-devs at haskell.org
Mon Sep 7 02:11:12 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:
-------------------------------------+-------------------------------------

Comment (by goldfire):

 Replying to [comment:3 nomeata]:
 > Is there code that is valid with and without your extension, but with
 different semantics?

 To me, this is the key question. I can't think of any. But let's dig
 deeper.

 I'm looking at the
 [https://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-220003
 Haskell 2010 Report] for parsing these sorts of things.

 Here's the relevant bit:

 {{{
 exp     →       infixexp :: [context =>] type       (expression type
 signature)
         |       infixexp

 infixexp→       lexp qop infixexp                   (infix operator
 application)
         |       - infixexp                          (prefix negation)
         |       lexp

 lexp    →       \ apat1 … apatn -> exp              (lambda abstraction, n
 ≥ 1)
         |       let decls in exp                    (let expression)
         |       if exp [;] then exp [;] else exp    (conditional)
         |       case exp of { alts }                (case expression)
         |       do { stmts }                        (do expression)
         |       fexp

 fexp    →       [fexp] aexp                         (function application)

 aexp    →       qvar                                (variable)
         |       gcon                                (general constructor)
         |       literal
         |       ( exp )                             (parenthesized
 expression)
         |       ( exp1 , … , expk )                 (tuple, k ≥ 2)
         |       [ exp1 , … , expk ]                 (list, k ≥ 1)
         |       [ exp1 [, exp2] .. [exp3] ]         (arithmetic sequence)
         |       [ exp | qual1 , … , qualn ]         (list comprehension, n
 ≥ 1)
         |       ( infixexp qop )                    (left section)
         |       ( qop⟨-⟩ infixexp )                  (right section)
         |       qcon { fbind1 , … , fbindn }        (labeled construction,
 n ≥ 0)
         |       aexp⟨qcon⟩ { fbind1 , … , fbindn }   (labeled update, n ≥
 1)
 }}}

 From this grammar, I was inspired to try the following silliness:

 {{{
 {-# LANGUAGE Haskell2010 #-}

 instance Num (IO ()) where
   negate = id

 main = - do
   putStrLn "hi"
 }}}

 (Note the `-` after the `main =`.) This fails with a parse error. I'd love
 for someone else to check this against the grammar and see if I should
 report a separate bug. How does this work in the patch supplied?

 In any case, even looking at the grammar, it looks like you've found a
 spot free in the grammar.

 How many shift/reduce conflicts does the grammar have? At last check,
 GHC's parser had 47. This isn't great, but we don't want to increase this
 number!

 Thanks for submitting a patch!

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


More information about the ghc-tickets mailing list