remove empty dir
[ghc-hetmet.git] / ghc / compiler / types / FunDeps.lhs
index 40e154f..9347f5f 100644 (file)
@@ -7,21 +7,29 @@ It's better to read it as: "if we know these, then we're going to know these"
 
 \begin{code}
 module FunDeps (
-       oclose, grow, improve, checkInstFDs, checkClsFD, pprFundeps
+       Equation, pprEquation,
+       oclose, grow, improve, 
+       checkInstCoverage, checkFunDeps,
+       pprFundeps
     ) where
 
 #include "HsVersions.h"
 
+import Name            ( Name, getSrcLoc )
 import Var             ( TyVar )
 import Class           ( Class, FunDep, classTvsFds )
-import Type            ( Type, ThetaType, PredType(..), predTyUnique, tyVarsOfTypes, tyVarsOfPred )
-import Subst           ( mkSubst, emptyInScopeSet, substTy )
-import Unify           ( unifyTyListsX, unifyExtendTysX )
-import Outputable      ( Outputable, SDoc, interppSP, ptext, empty, hsep, punctuate, comma )
+import Unify           ( tcUnifyTys, BindFlag(..) )
+import Type            ( substTys, notElemTvSubst )
+import TcType          ( Type, PredType(..), tcEqType, 
+                         predTyUnique, mkClassPred, tyVarsOfTypes, tyVarsOfPred )
+import InstEnv         ( Instance(..), InstEnv, instanceHead, classInstances,
+                         instanceCantMatch, roughMatchTcs )
 import VarSet
 import VarEnv
+import Outputable
+import Util             ( notNull )
 import List            ( tails )
-import Maybes          ( maybeToBool )
+import Maybe           ( isJust )
 import ListSetOps      ( equivClassesByUniq )
 \end{code}
 
@@ -118,8 +126,8 @@ oclose preds fixed_tvs
 \begin{code}
 grow :: [PredType] -> TyVarSet -> TyVarSet
 grow preds fixed_tvs 
-  | null pred_sets = fixed_tvs
-  | otherwise     = loop fixed_tvs
+  | null preds = fixed_tvs
+  | otherwise  = loop fixed_tvs
   where
     loop fixed_tvs
        | new_fixed_tvs `subVarSet` fixed_tvs = fixed_tvs
@@ -143,29 +151,40 @@ grow preds fixed_tvs
 
 \begin{code}
 ----------
-type Equation = (TyVarSet, Type,Type)  -- These two types should be equal, for some
-                                       -- substitution of the tyvars in the tyvar set
-       -- For example, ({a,b}, (a,Int,b), (Int,z,Bool))
-       -- We unify z with Int, but since a and b are quantified we do nothing to them
-       -- We usually act on an equation by instantiating the quantified type varaibles
-       -- to fresh type variables, and then calling the standard unifier.
-       -- 
-       -- INVARIANT: they aren't already equal
-
-
+type Equation = (TyVarSet, [(Type, Type)])
+-- These pairs of types should be equal, for some
+-- substitution of the tyvars in the tyvar set
+-- INVARIANT: corresponding types aren't already equal
+
+-- It's important that we have a *list* of pairs of types.  Consider
+--     class C a b c | a -> b c where ...
+--     instance C Int x x where ...
+-- Then, given the constraint (C Int Bool v) we should improve v to Bool,
+-- via the equation ({x}, [(Bool,x), (v,x)])
+-- This would not happen if the class had looked like
+--     class C a b c | a -> b, a -> c
+
+-- To "execute" the equation, make fresh type variable for each tyvar in the set,
+-- instantiate the two types with these fresh variables, and then unify.
+--
+-- For example, ({a,b}, (a,Int,b), (Int,z,Bool))
+-- We unify z with Int, but since a and b are quantified we do nothing to them
+-- We usually act on an equation by instantiating the quantified type varaibles
+-- to fresh type variables, and then calling the standard unifier.
+
+pprEquation (qtvs, pairs) 
+  = vcat [ptext SLIT("forall") <+> braces (pprWithCommas ppr (varSetElems qtvs)),
+         nest 2 (vcat [ ppr t1 <+> ptext SLIT(":=:") <+> ppr t2 | (t1,t2) <- pairs])]
 
 ----------
-improve :: InstEnv a           -- Gives instances for given class
-       -> [PredType]           -- Current constraints
-       -> [Equation]           -- Derived equalities that must also hold
-                               -- (NB the above INVARIANT for type Equation)
-
-type InstEnv a = Class -> [(TyVarSet, [Type], a)]
--- This is a bit clumsy, because InstEnv is really
--- defined in module InstEnv.  However, we don't want
--- to define it (and ClsInstEnv) here because InstEnv
--- is their home.  Nor do we want to make a recursive
--- module group (InstEnv imports stuff from FunDeps).
+type Pred_Loc = (PredType, SDoc)       -- SDoc says where the Pred comes from
+
+improve :: (Class -> [Instance])               -- Gives instances for given class
+       -> [Pred_Loc]                           -- Current constraints; 
+       -> [(Equation,Pred_Loc,Pred_Loc)]       -- Derived equalities that must also hold
+                                               -- (NB the above INVARIANT for type Equation)
+                                               -- The Pred_Locs explain which two predicates were
+                                               -- combined (for error messages)
 \end{code}
 
 Given a bunch of predicates that must hold, such as
@@ -199,18 +218,21 @@ NOTA BENE:
 
 \begin{code}
 improve inst_env preds
-  = [ eqn | group <- equivClassesByUniq predTyUnique preds,
+  = [ eqn | group <- equivClassesByUniq (predTyUnique . fst) preds,
            eqn   <- checkGroup inst_env group ]
 
 ----------
-checkGroup :: InstEnv a -> [PredType] -> [Equation]
+checkGroup :: (Class -> [Instance])
+          -> [Pred_Loc]
+          -> [(Equation, Pred_Loc, Pred_Loc)]
   -- The preds are all for the same class or implicit param
 
-checkGroup inst_env (IParam _ ty : ips)
+checkGroup inst_env (p1@(IParam _ ty, _) : ips)
   =    -- For implicit parameters, all the types must match
-    [(emptyVarSet, ty, ty') | IParam _ ty' <- ips, ty /= ty']
+    [ ((emptyVarSet, [(ty,ty')]), p1, p2) 
+    | p2@(IParam _ ty', _) <- ips, not (ty `tcEqType` ty')]
 
-checkGroup inst_env clss@(ClassP cls tys : _)
+checkGroup inst_env clss@((ClassP cls _, _) : _)
   =    -- For classes life is more complicated  
        -- Suppose the class is like
        --      classs C as | (l1 -> r1), (l2 -> r2), ... where ...
@@ -224,54 +246,113 @@ checkGroup inst_env clss@(ClassP cls tys : _)
        --
        -- We need to do something very similar comparing each predicate
        -- with relevant instance decls
-    pairwise_eqns ++ instance_eqns
+
+    instance_eqns ++ pairwise_eqns
+       -- NB: we put the instance equations first.   This biases the 
+       -- order so that we first improve individual constraints against the
+       -- instances (which are perhaps in a library and less likely to be
+       -- wrong; and THEN perform the pairwise checks.
+       -- The other way round, it's possible for the pairwise check to succeed
+       -- and cause a subsequent, misleading failure of one of the pair with an
+       -- instance declaration.  See tcfail143.hs for an exmample
 
   where
     (cls_tvs, cls_fds) = classTvsFds cls
-    cls_inst_env       = inst_env cls
+    instances         = inst_env cls
 
        -- NOTE that we iterate over the fds first; they are typically
        -- empty, which aborts the rest of the loop.
-    pairwise_eqns :: [Equation]
+    pairwise_eqns :: [(Equation,Pred_Loc,Pred_Loc)]
     pairwise_eqns      -- This group comes from pairwise comparison
-      = [ eqn | fd <- cls_fds,
-               ClassP _ tys1 : rest <- tails clss,
-               ClassP _ tys2   <- rest,
-               eqn <- checkClsFD emptyVarSet fd cls_tvs tys1 tys2
+      = [ (eqn, p1, p2)
+       | fd <- cls_fds,
+         p1@(ClassP _ tys1, _) : rest <- tails clss,
+         p2@(ClassP _ tys2, _) <- rest,
+         eqn <- checkClsFD emptyVarSet fd cls_tvs tys1 tys2
        ]
 
-    instance_eqns :: [Equation]
+    instance_eqns :: [(Equation,Pred_Loc,Pred_Loc)]
     instance_eqns      -- This group comes from comparing with instance decls
-      = [ eqn | fd <- cls_fds,
-               (qtvs, tys1, _) <- cls_inst_env,
-               ClassP _ tys2    <- clss,
-               eqn <- checkClsFD qtvs fd cls_tvs tys1 tys2
+      = [ (eqn, p1, p2)
+       | fd <- cls_fds,        -- Iterate through the fundeps first, 
+                               -- because there often are none!
+         p2@(ClassP _ tys2, _) <- clss,
+         let rough_tcs2 = trimRoughMatchTcs cls_tvs fd (roughMatchTcs tys2),
+         ispec@(Instance { is_tvs = qtvs, is_tys = tys1, 
+                           is_tcs = mb_tcs1 }) <- instances,
+         not (instanceCantMatch mb_tcs1 rough_tcs2),
+         eqn <- checkClsFD qtvs fd cls_tvs tys1 tys2,
+         let p1 = (mkClassPred cls tys1, 
+                   ptext SLIT("arising from the instance declaration at") <+> 
+                       ppr (getSrcLoc ispec))
        ]
-
-
 ----------
-checkClsFD :: TyVarSet                         -- The quantified type variables, which
-                                       -- can be instantiated to make the types match
+checkClsFD :: TyVarSet                         -- Quantified type variables; see note below
           -> FunDep TyVar -> [TyVar]   -- One functional dependency from the class
           -> [Type] -> [Type]
           -> [Equation]
 
 checkClsFD qtvs fd clas_tvs tys1 tys2
--- We use 'unify' even though we are often only matching
--- unifyTyListsX will only bind variables in qtvs, so it's OK!
-  = case unifyTyListsX qtvs ls1 ls2 of
-       Nothing   -> []
-       Just unif -> [ (qtvs', substTy full_unif r1, substTy full_unif r2)
-                    | (r1,r2) <- rs1 `zip` rs2,
-                      not (maybeToBool (unifyExtendTysX qtvs unif r1 r2))]
+-- 'qtvs' are the quantified type variables, the ones which an be instantiated 
+-- to make the types match.  For example, given
+--     class C a b | a->b where ...
+--     instance C (Maybe x) (Tree x) where ..
+--
+-- and an Inst of form (C (Maybe t1) t2), 
+-- then we will call checkClsFD with
+--
+--     qtvs = {x}, tys1 = [Maybe x,  Tree x]
+--                 tys2 = [Maybe t1, t2]
+--
+-- We can instantiate x to t1, and then we want to force
+--     (Tree x) [t1/x]  :=:   t2
+--
+-- This function is also used when matching two Insts (rather than an Inst
+-- against an instance decl. In that case, qtvs is empty, and we are doing
+-- an equality check
+-- 
+-- This function is also used by InstEnv.badFunDeps, which needs to *unify*
+-- For the one-sided matching case, the qtvs are just from the template,
+-- so we get matching
+--
+  = ASSERT2( length tys1 == length tys2     && 
+            length tys1 == length clas_tvs 
+           , ppr tys1 <+> ppr tys2 )
+
+    case tcUnifyTys bind_fn ls1 ls2 of
+       Nothing  -> []
+       Just subst | isJust (tcUnifyTys bind_fn rs1' rs2') 
+                       -- Don't include any equations that already hold. 
+                       -- Reason: then we know if any actual improvement has happened,
+                       --         in which case we need to iterate the solver
+                       -- In making this check we must taking account of the fact that any 
+                       -- qtvs that aren't already instantiated can be instantiated to anything 
+                       -- at all
+                 -> []
+
+                 | otherwise   -- Aha!  A useful equation
+                 -> [ (qtvs', zip rs1' rs2')]
+                       -- We could avoid this substTy stuff by producing the eqn
+                       -- (qtvs, ls1++rs1, ls2++rs2)
+                       -- which will re-do the ls1/ls2 unification when the equation is
+                       -- executed.  What we're doing instead is recording the partial
+                       -- work of the ls1/ls2 unification leaving a smaller unification problem
                  where
-                   full_unif = mkSubst emptyInScopeSet unif
-                       -- No for-alls in sight; hmm
-
-                   qtvs' = filterVarSet (\v -> not (v `elemSubstEnv` unif)) qtvs
+                   rs1'  = substTys subst rs1 
+                   rs2'  = substTys subst rs2
+                   qtvs' = filterVarSet (`notElemTvSubst` subst) qtvs
                        -- qtvs' are the quantified type variables
                        -- that have not been substituted out
+                       --      
+                       -- Eg.  class C a b | a -> b
+                       --      instance C Int [y]
+                       -- Given constraint C Int z
+                       -- we generate the equation
+                       --      ({y}, [y], z)
   where
+    bind_fn tv | tv `elemVarSet` qtvs = BindMe
+              | otherwise            = Skolem
+
     (ls1, rs1) = instFD fd clas_tvs tys1
     (ls2, rs2) = instFD fd clas_tvs tys2
 
@@ -284,22 +365,125 @@ instFD (ls,rs) tvs tys
 \end{code}
 
 \begin{code}
-checkInstFDs :: ThetaType -> Class -> [Type] -> Bool
--- Check that functional dependencies are obeyed in an instance decl
+checkInstCoverage :: Class -> [Type] -> Bool
+-- Check that the Coverage Condition is obeyed in an instance decl
 -- For example, if we have 
 --     class theta => C a b | a -> b
 --     instance C t1 t2 
--- Then we require fv(t2) `subset` oclose(fv(t1), theta)
+-- Then we require fv(t2) `subset` fv(t1)
+-- See Note [Coverage Condition] below
 
-checkInstFDs theta clas inst_taus
+checkInstCoverage clas inst_taus
   = all fundep_ok fds
   where
     (tyvars, fds) = classTvsFds clas
-    fundep_ok fd  = tyVarsOfTypes rs `subVarSet` oclose theta (tyVarsOfTypes ls)
+    fundep_ok fd  = tyVarsOfTypes rs `subVarSet` tyVarsOfTypes ls
                 where
                   (ls,rs) = instFD fd tyvars inst_taus
 \end{code}
 
+Note [Coverage condition]
+~~~~~~~~~~~~~~~~~~~~~~~~~
+For the coverage condition, we used to require only that 
+       fv(t2) `subset` oclose(fv(t1), theta)
+
+Example:
+       class Mul a b c | a b -> c where
+               (.*.) :: a -> b -> c
+
+       instance Mul Int Int Int where (.*.) = (*)
+       instance Mul Int Float Float where x .*. y = fromIntegral x * y
+       instance Mul a b c => Mul a [b] [c] where x .*. v = map (x.*.) v
+
+In the third instance, it's not the case that fv([c]) `subset` fv(a,[b]).
+But it is the case that fv([c]) `subset` oclose( theta, fv(a,[b]) )
+
+But it is a mistake to accept the instance because then this defn:
+       f = \ b x y -> if b then x .*. [y] else y
+makes instance inference go into a loop, because it requires the constraint
+       Mul a [b] b
+
+
+%************************************************************************
+%*                                                                     *
+       Check that a new instance decl is OK wrt fundeps
+%*                                                                     *
+%************************************************************************
+
+Here is the bad case:
+       class C a b | a->b where ...
+       instance C Int Bool where ...
+       instance C Int Char where ...
+
+The point is that a->b, so Int in the first parameter must uniquely
+determine the second.  In general, given the same class decl, and given
+
+       instance C s1 s2 where ...
+       instance C t1 t2 where ...
+
+Then the criterion is: if U=unify(s1,t1) then U(s2) = U(t2).
+
+Matters are a little more complicated if there are free variables in
+the s2/t2.  
+
+       class D a b c | a -> b
+       instance D a b => D [(a,a)] [b] Int
+       instance D a b => D [a]     [b] Bool
+
+The instance decls don't overlap, because the third parameter keeps
+them separate.  But we want to make sure that given any constraint
+       D s1 s2 s3
+if s1 matches 
+
+
+\begin{code}
+checkFunDeps :: (InstEnv, InstEnv) -> Instance
+            -> Maybe [Instance]        -- Nothing  <=> ok
+                                       -- Just dfs <=> conflict with dfs
+-- Check wheher adding DFunId would break functional-dependency constraints
+-- Used only for instance decls defined in the module being compiled
+checkFunDeps inst_envs ispec
+  | null bad_fundeps = Nothing
+  | otherwise       = Just bad_fundeps
+  where
+    (ins_tvs, _, clas, ins_tys) = instanceHead ispec
+    ins_tv_set   = mkVarSet ins_tvs
+    cls_inst_env = classInstances inst_envs clas
+    bad_fundeps  = badFunDeps cls_inst_env clas ins_tv_set ins_tys
+
+badFunDeps :: [Instance] -> Class
+          -> TyVarSet -> [Type]        -- Proposed new instance type
+          -> [Instance]
+badFunDeps cls_insts clas ins_tv_set ins_tys 
+  = [ ispec | fd <- fds,       -- fds is often empty
+             let trimmed_tcs = trimRoughMatchTcs clas_tvs fd rough_tcs,
+             ispec@(Instance { is_tcs = mb_tcs, is_tvs = tvs, 
+                               is_tys = tys }) <- cls_insts,
+               -- Filter out ones that can't possibly match, 
+               -- based on the head of the fundep
+             not (instanceCantMatch trimmed_tcs mb_tcs),       
+             notNull (checkClsFD (tvs `unionVarSet` ins_tv_set) 
+                                  fd clas_tvs tys ins_tys)
+    ]
+  where
+    (clas_tvs, fds) = classTvsFds clas
+    rough_tcs = roughMatchTcs ins_tys
+
+trimRoughMatchTcs :: [TyVar] -> FunDep TyVar -> [Maybe Name] -> [Maybe Name]
+-- Computing rough_tcs for a particular fundep
+--     class C a b c | a c -> b where ... 
+-- For each instance .... => C ta tb tc
+-- we want to match only on the types ta, tb; so our
+-- rough-match thing must similarly be filtered.  
+-- Hence, we Nothing-ise the tb type right here
+trimRoughMatchTcs clas_tvs (ltvs,_) mb_tcs
+  = zipWith select clas_tvs mb_tcs
+  where
+    select clas_tv mb_tc | clas_tv `elem` ltvs = mb_tc
+                        | otherwise           = Nothing
+\end{code}
+
+
 %************************************************************************
 %*                                                                     *
 \subsection{Miscellaneous}
@@ -313,3 +497,4 @@ pprFundeps fds = hsep (ptext SLIT("|") : punctuate comma (map ppr_fd fds))
 
 ppr_fd (us, vs) = hsep [interppSP us, ptext SLIT("->"), interppSP vs]
 \end{code}
+