[GHC] #14645: Allow type family in data family return kind
GHC
ghc-devs at haskell.org
Tue Jun 19 13:42:52 UTC 2018
#14645: Allow type family in data family return kind
-------------------------------------+-------------------------------------
Reporter: goldfire | Owner: (none)
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 8.4.1-alpha1
Resolution: | Keywords: TypeInType,
| TypeFamilies
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):
I tried giving this a go, but quickly became stuck. I'll dump my progress
here in case anyone finds it useful.
* The first step is revising a validity check to allow type families to
appear in data family return kinds. You'll need a predicate which checks
if a type is a type family application:
{{{#!hs
-- | Returns @'Just' (fam_tc, args)@ if the argument 'Type' is a type
family
-- constructor @fam_tc@ applied to some arguments @args at . Otherwise,
returns
-- @Nothing at .
tcGetTyFamTyConApp_maybe :: Type -> Maybe (TyCon, [Type])
tcGetTyFamTyConApp_maybe ty
| Just ty' <- tcView ty = tcGetTyFamTyConApp_maybe ty'
tcGetTyFamTyConApp_maybe (TyConApp fam_tc args)
| isTypeFamilyTyCon fam_tc = Just (fam_tc, args)
tcGetTyFamTyConApp_maybe _ = Nothing
}}}
Then you'll need to change `tcFamDecl1` to use this:
{{{#!diff
; checkTc (tcIsStarKind final_res_kind
- || isJust (tcGetCastedTyVar_maybe final_res_kind))
+ || isJust (tcGetCastedTyVar_maybe final_res_kind)
+ || isJust (tcGetTyFamTyConApp_maybe final_res_kind))
(badKindSig False res_kind)
}}}
* The next step is to figure out where to grab the type family instance
axiom from when typechecking data family instances (in
`tcDataFamInstDecl`).
My first inclination was to change `tcDataKindSig` to return a `CoAxiom`
resulting from the return kind signature. However, this doesn't always
work. For instance, in the example from comment:3, the return kind of the
`DF Bool (a :: Type)` instance is simply `Type` by the type you get to
`tcDataKindSig` (instead of something like `TF Bool`), which makes it
essentially impossible to grab a type family axiom from.
This makes me suspect that we need to grab this type family axiom
earlier, perhaps when typechecking the type family patterns (in
`tcFamTyPats`). At this point, I became lost.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14645#comment:7>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list