[GHC] #11982: Typechecking fails for parallel monad comprehensions with polymorphic let (GHC 7.10.3 through 8.6.3)
GHC
ghc-devs at haskell.org
Mon Jan 28 08:36:21 UTC 2019
#11982: Typechecking fails for parallel monad comprehensions with polymorphic let
(GHC 7.10.3 through 8.6.3)
-------------------------------------+-------------------------------------
Reporter: simonpj | Owner: josefs
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.10.3
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 simonmar):
Just to address the second point here, the transformations that the
renamer does for ApplicativeDo really are just annotations, not actual
transformations, in the sense that you can easily get back the original
program by just flattening out the `ApplicativeStmt`. It's done this way
for exactly the reason you mentioned Simon - the typechecker needs to
typecheck the code the user wrote. We also have to collect enough pieces
that the desugarer can build the transformed Core expression, so the
ApplicativeStmt has all the <$>, <*> and return identifiers.
In the renamer there's an ad-hoc algorithm to group the `let` statements
with the other statements in a `do`. I was never really happy with this,
but it's important to do *something* otherwise `let` statements cause a
loss of parallelism. We have tests for this - see `test9` in
`testsuite/tests/ado/ado001.hs`. The paper doesn't deal with `let`
unfortunately because we didn't include `let` statements in the grammar.
It would be nice to fully understand and document what we do here.
I also have a suspicion that we're not treating the last statement of the
`do` in the way that the paper suggests - adding an extra `return`
statement if the last statement is not a `return`. I think I was just
lazy, because doing it in the way the paper suggests but without actually
transforming the code (see discussion above) is a bit tricky.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11982#comment:15>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list