X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Ftypes%2FTyCon.lhs;h=c495ebb425e7c17575a01b837a05ebb646e6697a;hb=219f900f4e518e8158807cdda6fdec8331f701f0;hp=e1cf3f2269fb78d51e4c671f3c8baf72dcedff14;hpb=17b297d97d327620ed6bfab942f8992b2446f1bf;p=ghc-hetmet.git diff --git a/compiler/types/TyCon.lhs b/compiler/types/TyCon.lhs index e1cf3f2..c495ebb 100644 --- a/compiler/types/TyCon.lhs +++ b/compiler/types/TyCon.lhs @@ -6,11 +6,11 @@ The @TyCon@ datatype \begin{code} -{-# OPTIONS_GHC -w #-} +{-# OPTIONS -w #-} -- The above warning supression flag is a temporary kludge. -- While working on this module you are encouraged to remove it and fix -- any warnings in the module. See --- http://hackage.haskell.org/trac/ghc/wiki/WorkingConventions#Warnings +-- http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings -- for details module TyCon( @@ -33,7 +33,7 @@ module TyCon( isEnumerationTyCon, isGadtSyntaxTyCon, isOpenTyCon, assocTyConArgPoss_maybe, isTyConAssoc, setTyConArgPoss, isTupleTyCon, isUnboxedTupleTyCon, isBoxedTupleTyCon, tupleTyConBoxity, - isRecursiveTyCon, newTyConRep, newTyConRhs, newTyConCo_maybe, + isRecursiveTyCon, newTyConRhs, newTyConEtadRhs, newTyConCo_maybe, isHiBootTyCon, isSuperKindTyCon, isCoercionTyCon_maybe, isCoercionTyCon, isImplicitTyCon, @@ -250,31 +250,20 @@ data AlgTyConRhs -- = the representation type of the tycon -- The free tyvars of this type are the tyConTyVars - nt_co :: Maybe TyCon, -- The coercion used to create the newtype + nt_co :: Maybe TyCon, -- A CoercionTyCon used to create the newtype -- from the representation - -- optional for non-recursive newtypes + -- Optional for non-recursive newtypes -- See Note [Newtype coercions] + -- Invariant: arity = #tvs in nt_etad_rhs; + -- See Note [Newtype eta] + -- Watch out! If any newtypes become transparent + -- again check Trac #1072. - nt_etad_rhs :: ([TyVar], Type) , + nt_etad_rhs :: ([TyVar], Type) -- The same again, but this time eta-reduced -- hence the [TyVar] which may be shorter than the declared -- arity of the TyCon. See Note [Newtype eta] - - nt_rep :: Type -- Cached: the *ultimate* representation type - -- By 'ultimate' I mean that the top-level constructor - -- of the rep type is not itself a newtype or type synonym. - -- The rep type isn't entirely simple: - -- for a recursive newtype we pick () as the rep type - -- newtype T = MkT T - -- - -- This one does not need to be eta reduced; hence its - -- free type variables are conveniently tyConTyVars - -- Thus: - -- newtype T a = MkT [(a,Int)] - -- The rep type is [(a,Int)] - -- NB: the rep type isn't necessarily the original RHS of the - -- newtype decl, because the rep type looks through other - } -- newtypes. + } visibleDataCons :: AlgTyConRhs -> [DataCon] visibleDataCons AbstractTyCon = [] @@ -333,7 +322,6 @@ data SynTyConRhs Note [Newtype coercions] ~~~~~~~~~~~~~~~~~~~~~~~~ - The NewTyCon field nt_co is a a TyCon (a coercion constructor in fact) which is used for coercing from the representation type of the newtype, to the newtype itself. For example, @@ -397,6 +385,14 @@ we get: w2 = w1 And now Lint complains unless Foo T == Foo [], and that requires T==[] +This point carries over to the newtype coercion, because we need to +say + w2 = w1 `cast` Foo CoT + +so the coercion tycon CoT must have + kind: T ~ [] + and arity: 0 + Note [Indexed data types] (aka data type families) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -466,6 +462,7 @@ data PrimRep | AddrRep -- a pointer, but not to a Haskell value | FloatRep | DoubleRep + deriving( Eq ) -- Size of a PrimRep, in bytes sizeofPrimRep :: PrimRep -> Int @@ -805,7 +802,7 @@ tcExpandTyCon_maybe, coreExpandTyCon_maybe Type, -- Body type (not yet substituted) [Type]) -- Leftover args --- For the *typechecker* view, we expand synonyms only +-- For the *typechecker* view, we expand (closed) synonyms only tcExpandTyCon_maybe (SynTyCon {tyConTyVars = tvs, synTcRhs = SynonymTyCon rhs }) tys = expand tvs rhs tys @@ -859,9 +856,7 @@ tyConFamilySize (AlgTyCon {algTcRhs = DataTyCon {data_cons = cons}}) = tyConFamilySize (AlgTyCon {algTcRhs = NewTyCon {}}) = 1 tyConFamilySize (AlgTyCon {algTcRhs = OpenTyCon {}}) = 0 tyConFamilySize (TupleTyCon {}) = 1 -#ifdef DEBUG tyConFamilySize other = pprPanic "tyConFamilySize:" (ppr other) -#endif tyConSelIds :: TyCon -> [Id] tyConSelIds (AlgTyCon {algTcSelIds = fs}) = fs @@ -878,9 +873,9 @@ newTyConRhs :: TyCon -> ([TyVar], Type) newTyConRhs (AlgTyCon {tyConTyVars = tvs, algTcRhs = NewTyCon { nt_rhs = rhs }}) = (tvs, rhs) newTyConRhs tycon = pprPanic "newTyConRhs" (ppr tycon) -newTyConRep :: TyCon -> ([TyVar], Type) -newTyConRep (AlgTyCon {tyConTyVars = tvs, algTcRhs = NewTyCon { nt_rep = rep }}) = (tvs, rep) -newTyConRep tycon = pprPanic "newTyConRep" (ppr tycon) +newTyConEtadRhs :: TyCon -> ([TyVar], Type) +newTyConEtadRhs (AlgTyCon {algTcRhs = NewTyCon { nt_etad_rhs = tvs_rhs }}) = tvs_rhs +newTyConEtadRhs tycon = pprPanic "newTyConEtadRhs" (ppr tycon) newTyConCo_maybe :: TyCon -> Maybe TyCon newTyConCo_maybe (AlgTyCon {algTcRhs = NewTyCon { nt_co = co }}) = co