import Id ( idType )
import NameSet ( mkNameSet )
import Class ( classBigSig )
-import FunDeps ( oclose, grow, improve )
+import FunDeps ( oclose, grow, improve, pprEquationDoc )
import PrelInfo ( isNumericClass, isCreturnableClass, isCcallishClass )
import Subst ( mkTopTyVarSubst, substTheta, substTy )
if null eqns then
returnTc True
else
- traceTc (ptext SLIT("Improve:") <+> vcat (map ppr_eqn eqns)) `thenNF_Tc_`
+ traceTc (ptext SLIT("Improve:") <+> vcat (map pprEquationDoc eqns)) `thenNF_Tc_`
mapTc_ unify eqns `thenTc_`
returnTc False
where
= tcAddErrCtxt doc $
tcInstTyVars (varSetElems qtvs) `thenNF_Tc` \ (_, _, tenv) ->
unifyTauTy (substTy tenv t1) (substTy tenv t2)
- ppr_eqn ((qtvs, t1, t2), doc)
- = vcat [ptext SLIT("forall") <+> braces (pprWithCommas ppr (varSetElems qtvs))
- <+> ppr t1 <+> ptext SLIT(":=:") <+> ppr t2,
- nest 2 doc]
\end{code}
The main context-reduction function is @reduce@. Here's its game plan.
\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
--
+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))]
-- Don't include any equations that already hold