X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Ftypes%2FTypeRep.lhs;h=7705650e36182e38443c8e36b34e4ff9d9d08037;hb=80c89b80c355b2aaebcd53330e6c6170c3f05aca;hp=544b822f28ac49eed7b7b6601ee14e4a9280adab;hpb=0b86bc9b022a5965d2b35f143ff4b919f784e676;p=ghc-hetmet.git diff --git a/compiler/types/TypeRep.lhs b/compiler/types/TypeRep.lhs index 544b822..7705650 100644 --- a/compiler/types/TypeRep.lhs +++ b/compiler/types/TypeRep.lhs @@ -192,8 +192,11 @@ data Type TyVar Type - | PredTy -- A high level source type - PredType -- ...can be expanded to a representation type... + | PredTy -- The type of evidence for a type predictate + 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) | NoteTy -- A type with a note attached TyNote @@ -216,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 @@ -256,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. + %************************************************************************ %* *