2 % (c) The University of Glasgow 2006
3 % (c) The GRASP/AQUA Project, Glasgow University, 2000
6 FunDeps - functional dependencies
8 It's better to read it as: "if we know these, then we're going to know these"
12 Equation, pprEquation,
14 checkInstCoverage, checkFunDeps,
18 #include "HsVersions.h"
32 import Data.List ( nubBy )
33 import Data.Maybe ( isJust )
37 %************************************************************************
39 \subsection{Close type variables}
41 %************************************************************************
43 oclose(vs,C) The result of extending the set of tyvars vs
44 using the functional dependencies from C
46 grow(vs,C) The result of extend the set of tyvars vs
47 using all conceivable links from C.
49 E.g. vs = {a}, C = {H [a] b, K (b,Int) c, Eq e}
50 Then grow(vs,C) = {a,b,c}
52 Note that grow(vs,C) `superset` grow(vs,simplify(C))
53 That is, simplfication can only shrink the result of grow.
56 oclose is conservative v `elem` oclose(vs,C)
57 one way: => v is definitely fixed by vs
59 grow is conservative if v might be fixed by vs
60 the other way: => v `elem` grow(vs,C)
62 ----------------------------------------------------------
63 (oclose preds tvs) closes the set of type variables tvs,
64 wrt functional dependencies in preds. The result is a superset
65 of the argument set. For example, if we have
66 class C a b | a->b where ...
68 oclose [C (x,y) z, C (x,p) q] {x,y} = {x,y,z}
69 because if we know x and y then that fixes z.
71 oclose is used (only) when generalising a type T; see extensive
74 Note [Important subtlety in oclose]
75 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
76 Consider (oclose (C Int t) {}), where class C a b | a->b
77 Then, since a->b, 't' is fully determined by Int, and the
78 uniform thing is to return {t}.
82 f x = e -- 'e' generates constraint (D s Int t)
84 Then, if (oclose (D s Int t) {}) = {t}, we'll make the function
85 monomorphic in 't', thus
86 f :: forall s. D s Int t => s -> s
88 But if this function is never called, 't' will never be instantiated;
89 the functional dependencies that fix 't' may well be instance decls in
90 some importing module. But the top-level defaulting of unconstrained
91 type variables will fix t=GHC.Prim.Any, and that's simply a bug.
93 Conclusion: oclose only returns a type variable as "fixed" if it
94 depends on at least one type variable in the input fixed_tvs.
96 Remember, it's always sound for oclose to return a smaller set.
97 An interesting example is tcfail093, where we get this inferred type:
99 dup :: forall h. (Call (IO Int) h) => () -> Int -> h
100 This is perhaps a bit silly, because 'h' is fixed by the (IO Int);
101 previously GHC rejected this saying 'no instance for Call (IO Int) h'.
102 But it's right on the borderline. If there was an extra, otherwise
103 uninvolved type variable, like 's' in the type of 'f' above, then
104 we must accept the function. So, for now anyway, we accept 'dup' too.
107 oclose :: [PredType] -> TyVarSet -> TyVarSet
108 oclose preds fixed_tvs
109 | null tv_fds = fixed_tvs -- Fast escape hatch for common case
110 | isEmptyVarSet fixed_tvs = emptyVarSet -- Note [Important subtlety in oclose]
111 | otherwise = loop fixed_tvs
114 | new_fixed_tvs `subVarSet` fixed_tvs = fixed_tvs
115 | otherwise = loop new_fixed_tvs
117 new_fixed_tvs = foldl extend fixed_tvs tv_fds
119 extend fixed_tvs (ls,rs)
120 | not (isEmptyVarSet ls) -- Note [Important subtlety in oclose]
121 , ls `subVarSet` fixed_tvs = fixed_tvs `unionVarSet` rs
122 | otherwise = fixed_tvs
124 tv_fds :: [(TyVarSet,TyVarSet)]
125 -- In our example, tv_fds will be [ ({x,y}, {z}), ({x,p},{q}) ]
126 -- Meaning "knowing x,y fixes z, knowing x,p fixes q"
127 tv_fds = [ (tyVarsOfTypes xs, tyVarsOfTypes ys)
128 | ClassP cls tys <- preds, -- Ignore implicit params
129 let (cls_tvs, cls_fds) = classTvsFds cls,
131 let (xs,ys) = instFD fd cls_tvs tys
136 %************************************************************************
138 \subsection{Generate equations from functional dependencies}
140 %************************************************************************
144 type Equation = (TyVarSet, [(Type, Type)])
145 -- These pairs of types should be equal, for some
146 -- substitution of the tyvars in the tyvar set
147 -- INVARIANT: corresponding types aren't already equal
149 -- It's important that we have a *list* of pairs of types. Consider
150 -- class C a b c | a -> b c where ...
151 -- instance C Int x x where ...
152 -- Then, given the constraint (C Int Bool v) we should improve v to Bool,
153 -- via the equation ({x}, [(Bool,x), (v,x)])
154 -- This would not happen if the class had looked like
155 -- class C a b c | a -> b, a -> c
157 -- To "execute" the equation, make fresh type variable for each tyvar in the set,
158 -- instantiate the two types with these fresh variables, and then unify.
160 -- For example, ({a,b}, (a,Int,b), (Int,z,Bool))
161 -- We unify z with Int, but since a and b are quantified we do nothing to them
162 -- We usually act on an equation by instantiating the quantified type varaibles
163 -- to fresh type variables, and then calling the standard unifier.
165 pprEquation :: Equation -> SDoc
166 pprEquation (qtvs, pairs)
167 = vcat [ptext (sLit "forall") <+> braces (pprWithCommas ppr (varSetElems qtvs)),
168 nest 2 (vcat [ ppr t1 <+> ptext (sLit "~") <+> ppr t2 | (t1,t2) <- pairs])]
171 Given a bunch of predicates that must hold, such as
173 C Int t1, C Int t2, C Bool t3, ?x::t4, ?x::t5
175 improve figures out what extra equations must hold.
176 For example, if we have
178 class C a b | a->b where ...
180 then improve will return
186 * improve does not iterate. It's possible that when we make
187 t1=t2, for example, that will in turn trigger a new equation.
188 This would happen if we also had
190 If t1=t2, we also get t7=t8.
192 improve does *not* do this extra step. It relies on the caller
195 * The equations unify types that are not already equal. So there
196 is no effect iff the result of improve is empty
201 type Pred_Loc = (PredType, SDoc) -- SDoc says where the Pred comes from
203 improveOne :: (Class -> [Instance]) -- Gives instances for given class
204 -> Pred_Loc -- Do improvement triggered by this
205 -> [Pred_Loc] -- Current constraints
206 -> [(Equation,Pred_Loc,Pred_Loc)] -- Derived equalities that must also hold
207 -- (NB the above INVARIANT for type Equation)
208 -- The Pred_Locs explain which two predicates were
209 -- combined (for error messages)
210 -- Just do improvement triggered by a single, distinguised predicate
212 improveOne _inst_env pred@(IParam ip ty, _) preds
213 = [ ((emptyVarSet, [(ty,ty2)]), pred, p2)
214 | p2@(IParam ip2 ty2, _) <- preds
216 , not (ty `tcEqType` ty2)]
218 improveOne inst_env pred@(ClassP cls tys, _) preds
219 | tys `lengthAtLeast` 2
220 = instance_eqns ++ pairwise_eqns
221 -- NB: we put the instance equations first. This biases the
222 -- order so that we first improve individual constraints against the
223 -- instances (which are perhaps in a library and less likely to be
224 -- wrong; and THEN perform the pairwise checks.
225 -- The other way round, it's possible for the pairwise check to succeed
226 -- and cause a subsequent, misleading failure of one of the pair with an
227 -- instance declaration. See tcfail143.hs for an example
229 (cls_tvs, cls_fds) = classTvsFds cls
230 instances = inst_env cls
231 rough_tcs = roughMatchTcs tys
233 -- NOTE that we iterate over the fds first; they are typically
234 -- empty, which aborts the rest of the loop.
235 pairwise_eqns :: [(Equation,Pred_Loc,Pred_Loc)]
236 pairwise_eqns -- This group comes from pairwise comparison
239 , p2@(ClassP cls2 tys2, _) <- preds
241 , eqn <- checkClsFD emptyVarSet fd cls_tvs tys tys2
244 instance_eqns :: [(Equation,Pred_Loc,Pred_Loc)]
245 instance_eqns -- This group comes from comparing with instance decls
246 = [ (eqn, p_inst, pred)
247 | fd <- cls_fds -- Iterate through the fundeps first,
248 -- because there often are none!
249 , let trimmed_tcs = trimRoughMatchTcs cls_tvs fd rough_tcs
250 -- Trim the rough_tcs based on the head of the fundep.
251 -- Remember that instanceCantMatch treats both argumnents
252 -- symmetrically, so it's ok to trim the rough_tcs,
253 -- rather than trimming each inst_tcs in turn
254 , ispec@(Instance { is_tvs = qtvs, is_tys = tys_inst,
255 is_tcs = inst_tcs }) <- instances
256 , not (instanceCantMatch inst_tcs trimmed_tcs)
257 , eqn <- checkClsFD qtvs fd cls_tvs tys_inst tys
258 , let p_inst = (mkClassPred cls tys_inst,
259 sep [ ptext (sLit "arising from the dependency") <+> quotes (pprFunDep fd)
260 , ptext (sLit "in the instance declaration at")
261 <+> ppr (getSrcLoc ispec)])
268 checkClsFD :: TyVarSet -- Quantified type variables; see note below
269 -> FunDep TyVar -> [TyVar] -- One functional dependency from the class
273 checkClsFD qtvs fd clas_tvs tys1 tys2
274 -- 'qtvs' are the quantified type variables, the ones which an be instantiated
275 -- to make the types match. For example, given
276 -- class C a b | a->b where ...
277 -- instance C (Maybe x) (Tree x) where ..
279 -- and an Inst of form (C (Maybe t1) t2),
280 -- then we will call checkClsFD with
282 -- qtvs = {x}, tys1 = [Maybe x, Tree x]
283 -- tys2 = [Maybe t1, t2]
285 -- We can instantiate x to t1, and then we want to force
286 -- (Tree x) [t1/x] ~ t2
288 -- This function is also used when matching two Insts (rather than an Inst
289 -- against an instance decl. In that case, qtvs is empty, and we are doing
292 -- This function is also used by InstEnv.badFunDeps, which needs to *unify*
293 -- For the one-sided matching case, the qtvs are just from the template,
294 -- so we get matching
296 = ASSERT2( length tys1 == length tys2 &&
297 length tys1 == length clas_tvs
298 , ppr tys1 <+> ppr tys2 )
300 case tcUnifyTys bind_fn ls1 ls2 of
302 Just subst | isJust (tcUnifyTys bind_fn rs1' rs2')
303 -- Don't include any equations that already hold.
304 -- Reason: then we know if any actual improvement has happened,
305 -- in which case we need to iterate the solver
306 -- In making this check we must taking account of the fact that any
307 -- qtvs that aren't already instantiated can be instantiated to anything
311 | otherwise -- Aha! A useful equation
312 -> [ (qtvs', zip rs1' rs2')]
313 -- We could avoid this substTy stuff by producing the eqn
314 -- (qtvs, ls1++rs1, ls2++rs2)
315 -- which will re-do the ls1/ls2 unification when the equation is
316 -- executed. What we're doing instead is recording the partial
317 -- work of the ls1/ls2 unification leaving a smaller unification problem
319 rs1' = substTys subst rs1
320 rs2' = substTys subst rs2
321 qtvs' = filterVarSet (`notElemTvSubst` subst) qtvs
322 -- qtvs' are the quantified type variables
323 -- that have not been substituted out
325 -- Eg. class C a b | a -> b
326 -- instance C Int [y]
327 -- Given constraint C Int z
328 -- we generate the equation
331 bind_fn tv | tv `elemVarSet` qtvs = BindMe
334 (ls1, rs1) = instFD fd clas_tvs tys1
335 (ls2, rs2) = instFD fd clas_tvs tys2
337 instFD :: FunDep TyVar -> [TyVar] -> [Type] -> FunDep Type
338 instFD (ls,rs) tvs tys
339 = (map lookup ls, map lookup rs)
341 env = zipVarEnv tvs tys
342 lookup tv = lookupVarEnv_NF env tv
346 checkInstCoverage :: Class -> [Type] -> Bool
347 -- Check that the Coverage Condition is obeyed in an instance decl
348 -- For example, if we have
349 -- class theta => C a b | a -> b
351 -- Then we require fv(t2) `subset` fv(t1)
352 -- See Note [Coverage Condition] below
354 checkInstCoverage clas inst_taus
357 (tyvars, fds) = classTvsFds clas
358 fundep_ok fd = tyVarsOfTypes rs `subVarSet` tyVarsOfTypes ls
360 (ls,rs) = instFD fd tyvars inst_taus
363 Note [Coverage condition]
364 ~~~~~~~~~~~~~~~~~~~~~~~~~
365 For the coverage condition, we used to require only that
366 fv(t2) `subset` oclose(fv(t1), theta)
369 class Mul a b c | a b -> c where
372 instance Mul Int Int Int where (.*.) = (*)
373 instance Mul Int Float Float where x .*. y = fromIntegral x * y
374 instance Mul a b c => Mul a [b] [c] where x .*. v = map (x.*.) v
376 In the third instance, it's not the case that fv([c]) `subset` fv(a,[b]).
377 But it is the case that fv([c]) `subset` oclose( theta, fv(a,[b]) )
379 But it is a mistake to accept the instance because then this defn:
380 f = \ b x y -> if b then x .*. [y] else y
381 makes instance inference go into a loop, because it requires the constraint
385 %************************************************************************
387 Check that a new instance decl is OK wrt fundeps
389 %************************************************************************
391 Here is the bad case:
392 class C a b | a->b where ...
393 instance C Int Bool where ...
394 instance C Int Char where ...
396 The point is that a->b, so Int in the first parameter must uniquely
397 determine the second. In general, given the same class decl, and given
399 instance C s1 s2 where ...
400 instance C t1 t2 where ...
402 Then the criterion is: if U=unify(s1,t1) then U(s2) = U(t2).
404 Matters are a little more complicated if there are free variables in
407 class D a b c | a -> b
408 instance D a b => D [(a,a)] [b] Int
409 instance D a b => D [a] [b] Bool
411 The instance decls don't overlap, because the third parameter keeps
412 them separate. But we want to make sure that given any constraint
418 checkFunDeps :: (InstEnv, InstEnv) -> Instance
419 -> Maybe [Instance] -- Nothing <=> ok
420 -- Just dfs <=> conflict with dfs
421 -- Check wheher adding DFunId would break functional-dependency constraints
422 -- Used only for instance decls defined in the module being compiled
423 checkFunDeps inst_envs ispec
424 | null bad_fundeps = Nothing
425 | otherwise = Just bad_fundeps
427 (ins_tvs, _, clas, ins_tys) = instanceHead ispec
428 ins_tv_set = mkVarSet ins_tvs
429 cls_inst_env = classInstances inst_envs clas
430 bad_fundeps = badFunDeps cls_inst_env clas ins_tv_set ins_tys
432 badFunDeps :: [Instance] -> Class
433 -> TyVarSet -> [Type] -- Proposed new instance type
435 badFunDeps cls_insts clas ins_tv_set ins_tys
437 [ ispec | fd <- fds, -- fds is often empty, so do this first!
438 let trimmed_tcs = trimRoughMatchTcs clas_tvs fd rough_tcs,
439 ispec@(Instance { is_tcs = inst_tcs, is_tvs = tvs,
440 is_tys = tys }) <- cls_insts,
441 -- Filter out ones that can't possibly match,
442 -- based on the head of the fundep
443 not (instanceCantMatch inst_tcs trimmed_tcs),
444 notNull (checkClsFD (tvs `unionVarSet` ins_tv_set)
445 fd clas_tvs tys ins_tys)
448 (clas_tvs, fds) = classTvsFds clas
449 rough_tcs = roughMatchTcs ins_tys
450 eq_inst i1 i2 = instanceDFunId i1 == instanceDFunId i2
451 -- An single instance may appear twice in the un-nubbed conflict list
452 -- because it may conflict with more than one fundep. E.g.
453 -- class C a b c | a -> b, a -> c
454 -- instance C Int Bool Bool
455 -- instance C Int Char Char
456 -- The second instance conflicts with the first by *both* fundeps
458 trimRoughMatchTcs :: [TyVar] -> FunDep TyVar -> [Maybe Name] -> [Maybe Name]
459 -- Computing rough_tcs for a particular fundep
460 -- class C a b c | a -> b where ...
461 -- For each instance .... => C ta tb tc
462 -- we want to match only on the type ta; so our
463 -- rough-match thing must similarly be filtered.
464 -- Hence, we Nothing-ise the tb and tc types right here
465 trimRoughMatchTcs clas_tvs (ltvs, _) mb_tcs
466 = zipWith select clas_tvs mb_tcs
468 select clas_tv mb_tc | clas_tv `elem` ltvs = mb_tc
469 | otherwise = Nothing