
#10572: Template Haskell does not implicitly quantify types -------------------------------------+------------------------------------- Reporter: spinda | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Template Haskell | Version: 7.10.1 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: None/Unknown | Unknown/Multiple Blocked By: | Test Case: Related Tickets: | Blocking: | Differential Revisions: -------------------------------------+------------------------------------- Description changed by spinda: Old description:
Consider the simple quasiquoter producing a type variable:
{{{ tv :: QuasiQuoter tv = QuasiQuoter { quoteType = varT . mkName } }}}
If a type variable is introduced elsewhere in a type signature, it is implicitly quantified as normal and the TH name resolves properly:
{{{ id' :: a -> [tv|a|] id' x = x }}}
But if the type variable is not mentioned elsewhere in the type, an error results:
{{{ const' :: a -> [tv|b|] -> a const' x _ = x }}}
{{{ Not in scope: type variable ‘b’ }}}
One would expect the type variable introduced by the TH splice to be included in the implicit quantification of the type signature.
In fact, there is no way to introduce a new type variable in this context, apart from using {{{Rank(2/N)Types}}} with an explicit {{{forall}}}. But this prevents the type variable from being referred to elsewhere in the type, eg:
{{{ const'' :: [tv|a|] -> b -> [tv|a|] const'' x _ = x }}}
New description: Consider this simple quasiquoter producing a type variable: {{{ tv :: QuasiQuoter tv = QuasiQuoter { quoteType = varT . mkName } }}} If a type variable is introduced elsewhere in a type signature, it is implicitly quantified as normal and the TH name resolves properly: {{{ id' :: a -> [tv|a|] id' x = x }}} But if the type variable is not mentioned elsewhere in the type, an error results: {{{ const' :: a -> [tv|b|] -> a const' x _ = x }}} {{{ Not in scope: type variable ‘b’ }}} One would expect the type variable introduced by the TH splice to be included in the implicit quantification of the type signature. In fact, there is no way to introduce a new type variable in this context, apart from using {{{Rank(2/N)Types}}} with an explicit {{{forall}}}. But this prevents the type variable from being referred to elsewhere in the type, eg: {{{ const'' :: [tv|a|] -> b -> [tv|a|] const'' x _ = x }}} -- -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10572#comment:1 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler