Comments only
[ghc-hetmet.git] / compiler / types / TypeRep.lhs
index 544b822..7705650 100644 (file)
@@ -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.
+
 
 %************************************************************************
 %*                                                                     *