Comments only
authorManuel M T Chakravarty <chak@cse.unsw.edu.au>
Wed, 20 Sep 2006 18:30:51 +0000 (18:30 +0000)
committerManuel M T Chakravarty <chak@cse.unsw.edu.au>
Wed, 20 Sep 2006 18:30:51 +0000 (18:30 +0000)
Mon Sep 18 17:43:31 EDT 2006  Manuel M T Chakravarty <chak@cse.unsw.edu.au>
  * Comments only
  Wed Aug  9 04:45:19 EDT 2006  simonpj@microsoft.com
    * Comments only

compiler/hsSyn/HsBinds.lhs
compiler/types/TypeRep.lhs

index 40b51ca..300f683 100644 (file)
@@ -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 
index b0b5c63..7705650 100644 (file)
@@ -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.
+
 
 %************************************************************************
 %*                                                                     *