[GHC] #13648: ApplicativeDo selects "GHC.Base.Monad.return" when actions are used without patterns.

GHC ghc-devs at haskell.org
Tue May 9 07:20:22 UTC 2017


#13648: ApplicativeDo selects "GHC.Base.Monad.return" when actions are used without
patterns.
-------------------------------------+-------------------------------------
        Reporter:  AaronFriel        |                Owner:  (none)
            Type:  bug               |               Status:  new
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.2.1-rc1
      Resolution:                    |             Keywords:  ApplicativeDo
Operating System:  Unknown/Multiple  |         Architecture:
 Type of failure:  GHC rejects       |  Unknown/Multiple
  valid program                      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by AaronFriel):

 This turns out to be easier than I expected, which makes me expect it
 broke something else.

 The issue seems to be that the desugaring for `ApplicativeDo` had no casse
 for a `BodyStmt`. This was absent in three places: `stmtTreeToStmts`,
 `stmtTreeArg`, and `slurpIndependentStmts`.

 By adding a pattern match on `BodyStmt` and substituting the pattern where
 necessary with `nlWildPatName`, the desugaring now treats `BodyStmt`
 everywhere as a `BindStmt` with a wildcard pattern. This seems to work
 properly. Here is the renamer output before:

 {{{#!hs
 Main.testCase1 m1_a1O4 m2_a1O5
   = do () <- do m1_a1O4
                 GHC.Base.return () |
        () <- do m2_a1O5
                 GHC.Base.return ()
        return ()
 }}}

 After adding the additional case to `stmtTreeToStmts`, I found the output
 was this:


 {{{#!hs
 Main.testCase1 m1_a259 m2_a25a
   = do () <- do _ <- m1_a259
                 () |
        () <- do _ <- m2_a25a
                 ()
        return ()
 }}}

 While this ought to optimize just as well, it was clear the body
 statements were being grouped into separate applicative segments. To make
 sure this is handled correctly, I modified `stmtTreeArg` and
 `slurpIndependentStmts` as well. Now the renamer outputs the same AST for
 both wildcard pattern binds and body statements:

 {{{#!hs
 Main.testCase1 m1_a1N9 m2_a1Na
   = do _ <- m1_a1N9 | _ <- m2_a1Na
        return ()
 Main.testCase2 m1_a1Nf m2_a1Ng
   = do _ <- m1_a1Nf | _ <- m2_a1Ng
        return ()
 }}}

 I think if I did this correctly, the patch is pushed to phabricator here:
 https://phabricator.haskell.org/D3552

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


More information about the ghc-tickets mailing list