%
+% (c) The University of Glasgow 2006
% (c) The GRASP/AQUA Project, Glasgow University, 2000
%
-\section[FunDeps]{FunDeps - functional dependencies}
+
+FunDeps - functional dependencies
It's better to read it as: "if we know these, then we're going to know these"
#include "HsVersions.h"
-import Name ( Name, getSrcLoc )
-import Var ( TyVar )
-import Class ( Class, FunDep, classTvsFds )
-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 Name
+import Var
+import Class
+import TcGadt
+import Type
+import Coercion
+import TcType
+import InstEnv
import VarSet
import VarEnv
import Outputable
-import Util ( notNull )
-import List ( tails )
-import Maybe ( isJust )
-import ListSetOps ( equivClassesByUniq )
+import Util
+import ListSetOps
+
+import Data.List ( tails )
+import Data.Maybe ( isJust )
\end{code}
\begin{code}
improve inst_env preds
- = [ eqn | group <- equivClassesByUniq (predTyUnique . fst) preds,
+ = [ eqn | group <- equivClassesByUniq (predTyUnique . fst) (filterEqPreds preds),
eqn <- checkGroup inst_env group ]
+ where
+ filterEqPreds = filter (not . isEqPred . fst)
+ -- Equality predicates don't have uniques
+ -- In any case, improvement *generates*, rather than
+ -- *consumes*, equality constraints
----------
checkGroup :: (Class -> [Instance])
\end{code}
-%************************************************************************
-%* *
-\subsection{Miscellaneous}
-%* *
-%************************************************************************
-
-\begin{code}
-pprFundeps :: Outputable a => [FunDep a] -> SDoc
-pprFundeps [] = empty
-pprFundeps fds = hsep (ptext SLIT("|") : punctuate comma (map ppr_fd fds))
-
-ppr_fd (us, vs) = hsep [interppSP us, ptext SLIT("->"), interppSP vs]
-\end{code}