\begin{code}
--- TyClDecls are precisely the kind of declarations that can
--- appear in interface files; or (internally) in GHC's interface
--- for a module. That's why (despite the misnomer) IfaceSig and ForeignType
--- are both in TyClDecl
-
-- Representation of indexed types
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- Kind signatures of indexed types come in two flavours:
| TyData { tcdND :: NewOrData,
tcdCtxt :: LHsContext name, -- Context
tcdLName :: Located name, -- Type constructor
+
tcdTyVars :: [LHsTyVarBndr name], -- Type variables
+
tcdTyPats :: Maybe [LHsType name], -- Type patterns
- tcdKindSig:: Maybe Kind, -- Optional kind sig;
- -- (only for the
- -- 'where' form and
- -- indexed type sigs)
+ -- Just [t1..tn] for data instance T t1..tn = ...
+ -- in this case tcdTyVars = fv( tcdTyPats )
+ -- Nothing for everything else
+
+ tcdKindSig:: Maybe Kind, -- Optional kind sig
+ -- (Just k) for a
+ -- (a) GADT-style 'data', or 'data instance' decl
+ -- with explicit kind sig
+ -- (b) 'data family' decl, whether or not
+ -- there is an explicit kind sig
+ -- (this is how we distinguish a data family decl)
tcdCons :: [LConDecl name], -- Data constructors
-- For data T a = T1 | T2 a the LConDecls all have ResTyH98
-- Typically the foralls and ty args are empty, but they
-- are non-empty for the newtype-deriving case
}
+ -- data family: tcdPats = Nothing, tcdCons = [], tcdKindSig = Just k
+ --
+ -- data instance: tcdPats = Just tys
+ --
+ -- data: tcdPats = Nothing,
+ -- tcdCons is non-empty *or* tcdKindSig = Nothing
| TyFunction {tcdLName :: Located name, -- type constructor
tcdTyVars :: [LHsTyVarBndr name], -- type variables
| TySynonym { tcdLName :: Located name, -- type constructor
tcdTyVars :: [LHsTyVarBndr name], -- type variables
tcdTyPats :: Maybe [LHsType name], -- Type patterns
- -- 'Nothing' => vanilla
- -- type synonym
+ -- See comments for tcdTyPats in TyData
+ -- 'Nothing' => vanilla type synonym
+
tcdSynRhs :: LHsType name -- synonym expansion
}
\begin{code}
type LDerivDecl name = Located (DerivDecl name)
-data DerivDecl name
- = DerivDecl (LHsType name) (Located name)
+data DerivDecl name = DerivDecl (LHsType name)
instance (OutputableBndr name) => Outputable (DerivDecl name) where
- ppr (DerivDecl ty n)
- = hsep [ptext SLIT("deriving"), ppr ty, ptext SLIT("for"), ppr n]
+ ppr (DerivDecl ty)
+ = hsep [ptext SLIT("derived instance"), ppr ty]
\end{code}
%************************************************************************