[GHC] #10572: Type signatures are not implicitly quantified over TH type variables
GHC
ghc-devs at haskell.org
Tue May 1 11:47:13 UTC 2018
#10572: Type signatures are not implicitly quantified over TH type variables
-------------------------------------+-------------------------------------
Reporter: spinda | Owner: (none)
Type: bug | Status: patch
Priority: normal | Milestone:
Component: Template Haskell | Version: 7.10.1
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: None/Unknown | Test Case:
| tests/th/T10572a, tests/th/T10572a
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s): Phab:D4641
Wiki Page: |
-------------------------------------+-------------------------------------
Changes (by simonpj):
* cc: goldfire (added)
Comment:
Thanks for the patch. I've had a look, and I really wonder whether the
gain is worth the pain.
The pain is significant: a whole extra usually-wasted pass `trySpliceTy`
over every `HsType` to expand any splices, before renaming. And I'm not
even certain that will work; what about
{{{
f :: $(g 'a) -> a
}}}
Here `g 'a` might expand to some type involving `a`; but it does require
`a` to be in scope already.
In the examples, wouldn't it all be clearer if we had an explicit forall?
Thus
{{{
const'' :: forall a. [tv|a|] -> b -> [tv|a|]
}}}
Overall, I feel unsure about this.
Richard, you are TH supremo, and you wrote the still-rather-cyptic note
{{{
Note [rnSplicePat]
~~~~~~~~~~~~~~~~~~
Renaming a pattern splice is a bit tricky, because we need the variables
bound in the pattern to be in scope in the RHS of the pattern. This scope
management is effectively done by using continuation-passing style in
RnPat, through the CpsRn monad. We don't wish to be in that monad here
(it would create import cycles and generally conflict with renaming other
splices), so we really want to return a (Pat RdrName) -- the result of
running the splice -- which can then be further renamed in RnPat, in
the CpsRn monad.
The problem is that if we're renaming a splice within a bracket, we
*don't* want to run the splice now. We really do just want to rename
it to an HsSplice Name. Of course, then we can't know what variables
are bound within the splice. So we accept any unbound variables and
rename them again when the bracket is spliced in. If a variable is
brought
into scope by a pattern splice all is fine. If it is not then an error is
reported.
In any case, when we're done in rnSplicePat, we'll either have a
Pat RdrName (the result of running a top-level splice) or a Pat Name
(the renamed nested splice). Thus, the awkward return type of
rnSplicePat.
}}}
(NB: the pattern situation is much less bad than the propose solution for
types, because it doesn't require a whole extra pass.)
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10572#comment:6>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list