[GHC] #16356: Unexpected type application in default declaration
GHC
ghc-devs at haskell.org
Wed Feb 27 16:04:33 UTC 2019
#16356: Unexpected type application in default declaration
-------------------------------------+-------------------------------------
Reporter: int-index | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler (Type | Version: 8.6.3
checker) |
Resolution: | Keywords:
Operating System: Unknown/Multiple | Architecture:
| Unknown/Multiple
Type of failure: None/Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: | Differential Rev(s):
Wiki Page: |
-------------------------------------+-------------------------------------
Comment (by RyanGlScott):
Upon further thought, I downplayed the amount of effort required to make
this work in comment:1.
[https://gitlab.haskell.org/ghc/ghc/blob/2e8f664957dc3763dc4375894b8dc4d046d2e95b/compiler/typecheck/TcTyClsDecls.hs#L1401-1419
This code] in `TcTyClsDecls.tcDefaultAssocDecl` is problematic:
{{{#!hs
tcDefaultAssocDecl fam_tc [dL->L loc (FamEqn { feqn_tycon = L _ tc_name
, feqn_pats = hs_tvs
, feqn_rhs = hs_rhs_ty })]
| HsQTvs { hsq_ext = HsQTvsRn { hsq_implicit = imp_vars}
, hsq_explicit = exp_vars } <- hs_tvs
= -- <elided>
fam_arity = length (tyConVisibleTyVars fam_tc)
-- <elided>
-- Arity check
; checkTc (exp_vars `lengthIs` fam_arity)
(wrongNumberOfParmsErr fam_arity)
}}}
Unless the number of `exp_vars` is exactly the number of visible arguments
that the type family expects, then `wrongNumberOfParmsErr` will throw an
error. Unfortunately, it turns out that `exp_vars` //includes// visible
kind arguments! In other words, if you have this:
{{{#!hs
class FAssocDefaultClass k where
type FAssocDefault :: k -> Type
type FAssocDefault @k = B @k
}}}
Then `exp_vars = [k]` and `fam_arity = 0`, which means that GHC will
mistakenly reject `FAssocDefault` under the guise that it supplies too
many arguments.
-----
Why, then, does this problem not occur for ordinary type family equations?
It turns out that it's because GHC stores the ASTs for each form of
declaration in subtly different ways.
[https://gitlab.haskell.org/ghc/ghc/blob/2e8f664957dc3763dc4375894b8dc4d046d2e95b/compiler/hsSyn/HsDecls.hs#L1618-1619
This] is how GHC represents ordinary type family equations:
{{{#!hs
type FamInstEqn pass rhs
= HsImplicitBndrs pass (FamEqn pass (HsTyPats pass) rhs)
}}}
And
[https://gitlab.haskell.org/ghc/ghc/blob/2e8f664957dc3763dc4375894b8dc4d046d2e95b/compiler/hsSyn/HsDecls.hs#L1581
this] is how GHC represents associated type family defaults:
{{{#!hs
type TyFamDefltEqn pass = FamEqn pass (LHsQTyVars pass) (LHsType pass)
}}}
The important bit here is the second argument to `FamEqn`, which
represents the patterns in the type family equation. In `FamInstEqn`s, the
patterns are `HsTyPats`, which distinguish between ordinary arguments and
visible kind arguments. In `TyFamDefltEqn`, however, the patterns are
`LHsQTyVars`. AFAICT, `LHsQTyVars` do not make any sort of distinction
between ordinary arguments and visible kind arguments, instead only caring
about explicitly vs. implicitly quantified variables.
-----
How, then, should we change things to allow VKAs in type family defaults?
One option is to try switching out `LHsQTyVars` for `HsTyPats` in
`TyFamDefltEqn`. I'm not clear as to why we're using `LHsQTyVars` in the
first place, however, so it's possible that there actually is a good
reason for its existence here. If so, another alternative would be to
somehow augment `LHsQTyVars` with informative about which of its arguments
are VKAs or not.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/16356#comment:3>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list