X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2Ftypes%2FTypeRep.lhs;h=7705650e36182e38443c8e36b34e4ff9d9d08037;hp=b0b5c63c81fae87a827d85ebecf516b795f0d4df;hb=4c6584511f12354e0c8adaa8923be5f58471e68a;hpb=7676e57a3a0868448cad6e52aa1e69ef2d76158c diff --git a/compiler/types/TypeRep.lhs b/compiler/types/TypeRep.lhs index b0b5c63..7705650 100644 --- a/compiler/types/TypeRep.lhs +++ b/compiler/types/TypeRep.lhs @@ -193,7 +193,7 @@ data Type Type | PredTy -- The type of evidence for a type predictate - PredType -- Can be expanded to a representation type. + PredType -- See Note [PredTy], and Note [Equality predicates] -- NB: A PredTy (EqPred _ _) can appear only as the kind -- of a coercion variable; never as the argument or result -- of a FunTy (unlike ClassP, IParam) @@ -219,7 +219,7 @@ data TyNote = FTVNote TyVarSet -- The free type variables of the noted expressio \end{code} ------------------------------------- - Source types + Note [PredTy] A type of the form PredTy p @@ -259,6 +259,24 @@ The predicate really does turn into a real extra argument to the function. If the argument has type (PredTy p) then the predicate p is represented by evidence (a dictionary, for example, of type (predRepTy p). +Note [Equality predicates] +~~~~~~~~~~~~~~~~~~~~~~~~~~ + forall a b. (a :=: S b) => a -> b +could be represented by + ForAllTy a (ForAllTy b (FunTy (PredTy (EqPred a (S b))) ...)) +OR + ForAllTy a (ForAllTy b (ForAllTy (c::PredTy (EqPred a (S b))) ...)) + +The latter is what we do. (Unlike for class and implicit parameter +constraints, which do use FunTy.) + +Reason: + * FunTy is always a *value* function + * ForAllTy is discarded at runtime + +We often need to make a "wildcard" (c::PredTy..). We always use the same +name (wildCoVarName), since it's not mentioned. + %************************************************************************ %* *