\begin{code}
module FunDeps (
+ Equation, pprEquation, pprEquationDoc,
oclose, grow, improve, checkInstFDs, checkClsFD, pprFundeps
) where
predTyUnique, mkClassPred, tyVarsOfTypes, tyVarsOfPred,
unifyTyListsX, unifyExtendTysX, tcEqType
)
+import PprType ( )
import VarSet
import VarEnv
import Outputable
\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
--
+pprEquationDoc (eqn, doc) = vcat [pprEquation eqn, nest 2 doc]
+
+pprEquation (qtvs, t1, t2) = ptext SLIT("forall") <+> braces (pprWithCommas ppr (varSetElems qtvs))
+ <+> ppr t1 <+> ptext SLIT(":=:") <+> ppr t2
----------
improve :: InstEnv Id -- Gives instances for given class
-- 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)
+ Just unif -> -- pprTrace "checkFD" (vcat [ppr_fd fd,
+ -- ppr (varSetElems qtvs) <+> (ppr ls1 $$ ppr ls2),
+ -- ppr unif]) $
+ [ (qtvs', substTy full_unif r1, substTy full_unif r2)
| (r1,r2) <- rs1 `zip` rs2,
- not (maybeToBool (unifyExtendTysX qtvs' unif r1 r2))]
+ not (maybeToBool (unifyExtendTysX qtvs unif r1 r2))]
-- Don't include any equations that already hold
-- taking account of the fact that any qtvs that aren't
-- already instantiated can be instantiated to anything at all
+ -- NB: qtvs, not qtvs' because unifyExtendTysX only tries to
+ -- look template tyvars up in the substitution
where
full_unif = mkSubst emptyInScopeSet unif
-- No for-alls in sight; hmm