From 8d992aa26acc3ea744dcbbc366ab89739e4b6230 Mon Sep 17 00:00:00 2001 From: "simonpj@microsoft.com" Date: Fri, 6 Jul 2007 09:48:36 +0000 Subject: [PATCH] Clarify comments --- compiler/types/FunDeps.lhs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/compiler/types/FunDeps.lhs b/compiler/types/FunDeps.lhs index 30549dd..b45778a 100644 --- a/compiler/types/FunDeps.lhs +++ b/compiler/types/FunDeps.lhs @@ -76,21 +76,29 @@ uniform thing is to return {t}. However, consider class D a b c | b->c - f x = e -- Generates constraint (D s Int t) + f x = e -- 'e' generates constraint (D s Int t) -- \x.e has type s->s Then, if (oclose (D s Int t) {}) = {t}, we'll make the function monomorphic in 't', thus f :: forall s. D s Int t => s -> s -But if this function is never called, t will never be instantiated; -the functional dependencies that fix t may well be instance decls in +But if this function is never called, 't' will never be instantiated; +the functional dependencies that fix 't' may well be instance decls in some importing module. But the top-level defaulting of unconstrained -type variales will fix t=GHC.Prim.Any, and that's simply a bug. +type variables will fix t=GHC.Prim.Any, and that's simply a bug. Conclusion: oclose only returns a type variable as "fixed" if it depends on at least one type variable in the input fixed_tvs. Remember, it's always sound for oclose to return a smaller set. +An interesting example is tcfail093, where we get this inferred type: + class C a b | a->b + dup :: forall h. (Call (IO Int) h) => () -> Int -> h +This is perhaps a bit silly, because 'h' is fixed by the (IO Int); +previously GHC rejected this saying 'no instance for Call (IO Int) h'. +But it's right on the borderline. If there was an extra, otherwise +uninvolved type variable, like 's' in the type of 'f' above, then +we must accept the function. So, for now anyway, we accept 'dup' too. \begin{code} oclose :: [PredType] -> TyVarSet -> TyVarSet -- 1.7.10.4