From 4c6584511f12354e0c8adaa8923be5f58471e68a Mon Sep 17 00:00:00 2001 From: Manuel M T Chakravarty Date: Wed, 20 Sep 2006 18:30:51 +0000 Subject: [PATCH] Comments only Mon Sep 18 17:43:31 EDT 2006 Manuel M T Chakravarty * Comments only Wed Aug 9 04:45:19 EDT 2006 simonpj@microsoft.com * Comments only --- compiler/hsSyn/HsBinds.lhs | 4 +--- compiler/types/TypeRep.lhs | 22 ++++++++++++++++++++-- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/compiler/hsSyn/HsBinds.lhs b/compiler/hsSyn/HsBinds.lhs index 40b51ca..300f683 100644 --- a/compiler/hsSyn/HsBinds.lhs +++ b/compiler/hsSyn/HsBinds.lhs @@ -84,9 +84,7 @@ data HsBind id -- (with a free type variable a'). The coercion will take -- a CoreExpr of this type and convert it to a CoreExpr of -- type Int -> forall a'. a' -> a' - -- Notice that the coercion captures the free a'. That's - -- why coercions are (CoreExpr -> CoreExpr), rather than - -- just CoreExpr (with a functional type) + -- Notice that the coercion captures the free a'. bind_fvs :: NameSet -- After the renamer, this contains a superset of the -- Names of the other binders in this binding group that 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. + %************************************************************************ %* * -- 1.7.10.4