[commit: ghc] master: Close over kinds when checking fundep coverage (Trac #8391) (9d908c5)
git at git.haskell.org
git
Thu Oct 3 08:26:01 UTC 2013
Repository : ssh://git at git.haskell.org/ghc
On branch : master
Link : http://ghc.haskell.org/trac/ghc/changeset/9d908c523bf61936ef372b70d5f8548fb36da26e/ghc
>---------------------------------------------------------------
commit 9d908c523bf61936ef372b70d5f8548fb36da26e
Author: Simon Peyton Jones <simonpj at microsoft.com>
Date: Wed Oct 2 13:59:41 2013 +0100
Close over kinds when checking fundep coverage (Trac #8391)
See Note [Closing over kinds in coverage] in FunDeps
>---------------------------------------------------------------
9d908c523bf61936ef372b70d5f8548fb36da26e
compiler/types/FunDeps.lhs | 21 +++++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/compiler/types/FunDeps.lhs b/compiler/types/FunDeps.lhs
index 8f255b7..77010de 100644
--- a/compiler/types/FunDeps.lhs
+++ b/compiler/types/FunDeps.lhs
@@ -466,10 +466,11 @@ checkInstCoverage be_liberal clas theta inst_taus
| if be_liberal then liberal_ok else conservative_ok
= Nothing
| otherwise
- = Just msg
+ = pprTrace "cic" (vcat [ppr clas <+> ppr inst_taus, ppr fd, ppr ls_tvs, ppr rs_tvs, ppr (oclose theta ls_tvs), ppr theta]) $
+ Just msg
where
(ls,rs) = instFD fd tyvars inst_taus
- ls_tvs = tyVarsOfTypes ls
+ ls_tvs = closeOverKinds (tyVarsOfTypes ls) -- See Note [Closing over kinds in coverage]
rs_tvs = tyVarsOfTypes rs
conservative_ok = rs_tvs `subVarSet` ls_tvs
@@ -492,6 +493,22 @@ checkInstCoverage be_liberal clas theta inst_taus
ptext (sLit "Using UndecidableInstances might help") ]
\end{code}
+Note [Closing over kinds in coverage]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Suppose we have a fundep (a::k) -> b
+Then if 'a' is instantiated to (x y), where x:k2->*, y:k2,
+then fixing x really fixes k2 as well, and so k2 should be added to
+the lhs tyvars in the fundep check.
+
+Example (Trac #8391), using liberal coverage
+
+ type Foo a = a -- Foo :: forall k. k -> k
+ class Bar a b | a -> b
+ instance Bar a (Foo a)
+
+In the instance decl, (a:k) does fix (Foo k a), but only if we notice
+that (a:k) fixes k.
+
Note [Coverage condition]
~~~~~~~~~~~~~~~~~~~~~~~~~
Example
More information about the ghc-commits
mailing list