2 % (c) The University of Glasgow 2006
3 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
6 The @Inst@ type: dictionaries or method instances
10 -- The above warning supression flag is a temporary kludge.
11 -- While working on this module you are encouraged to remove it and fix
12 -- any warnings in the module. See
13 -- http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
19 pprInstances, pprDictsTheta, pprDictsInFull, -- User error messages
20 showLIE, pprInst, pprInsts, pprInstInFull, -- Debugging messages
22 tidyInsts, tidyMoreInsts,
24 newDictBndr, newDictBndrs, newDictBndrsO,
25 instCall, instStupidTheta,
27 shortCutFracLit, shortCutIntLit, shortCutStringLit, newIPDict,
28 newMethod, newMethodFromName, newMethodWithGivenTy,
30 tcSyntaxName, isHsVar,
32 tyVarsOfInst, tyVarsOfInsts, tyVarsOfLIE,
33 ipNamesOfInst, ipNamesOfInsts, fdPredsOfInst, fdPredsOfInsts,
34 getDictClassTys, dictPred,
36 lookupSimpleInst, LookupInstResult(..),
37 tcExtendLocalInstEnv, tcGetInstEnvs, getOverlapFlag,
39 isAbstractableInst, isEqInst,
40 isDict, isClassDict, isMethod, isImplicInst,
41 isIPDict, isInheritableInst, isMethodOrLit,
42 isTyVarDict, isMethodFor,
45 instToId, instToVar, instType, instName, instToDictBind,
48 InstOrigin(..), InstLoc, pprInstLoc,
50 mkWantedCo, mkGivenCo,
51 fromWantedCo, fromGivenCo,
52 eitherEqInst, mkEqInst, mkEqInsts, mkWantedEqInst,
53 finalizeEqInst, writeWantedCoercion,
54 eqInstType, updateEqInstCoercion,
55 eqInstCoercion, eqInstTys
58 #include "HsVersions.h"
60 import {-# SOURCE #-} TcExpr( tcPolyExpr )
61 import {-# SOURCE #-} TcUnify( boxyUnify, unifyType )
63 import FastString(FastString)
85 import Var ( Var, TyVar )
110 instName :: Inst -> Name
111 instName (EqInst {tci_name = name}) = name
112 instName inst = Var.varName (instToVar inst)
114 instToId :: Inst -> TcId
115 instToId inst = WARN( not (isId id), ppr inst )
120 instToVar :: Inst -> Var
121 instToVar (LitInst {tci_name = nm, tci_ty = ty})
123 instToVar (Method {tci_id = id})
125 instToVar (Dict {tci_name = nm, tci_pred = pred})
126 | isEqPred pred = Var.mkCoVar nm (mkPredTy pred)
127 | otherwise = mkLocalId nm (mkPredTy pred)
128 instToVar (ImplicInst {tci_name = nm, tci_tyvars = tvs, tci_given = givens,
129 tci_wanted = wanteds})
130 = mkLocalId nm (mkImplicTy tvs givens wanteds)
131 instToVar i@(EqInst {})
132 = eitherEqInst i id (\(TyVarTy covar) -> covar)
134 instType :: Inst -> Type
135 instType (LitInst {tci_ty = ty}) = ty
136 instType (Method {tci_id = id}) = idType id
137 instType (Dict {tci_pred = pred}) = mkPredTy pred
138 instType imp@(ImplicInst {}) = mkImplicTy (tci_tyvars imp) (tci_given imp)
140 -- instType i@(EqInst {tci_co = co}) = eitherEqInst i TyVarTy id
141 instType (EqInst {tci_left = ty1, tci_right = ty2}) = mkPredTy (EqPred ty1 ty2)
143 mkImplicTy tvs givens wanteds -- The type of an implication constraint
144 = ASSERT( all isAbstractableInst givens )
145 -- pprTrace "mkImplicTy" (ppr givens) $
146 -- See [Equational Constraints in Implication Constraints]
147 let dict_wanteds = filter (not . isEqInst) wanteds
150 mkPhiTy (map dictPred givens) $
151 if isSingleton dict_wanteds then
152 instType (head dict_wanteds)
154 mkTupleTy Boxed (length dict_wanteds) (map instType dict_wanteds)
156 dictPred (Dict {tci_pred = pred}) = pred
157 dictPred (EqInst {tci_left=ty1,tci_right=ty2}) = EqPred ty1 ty2
158 dictPred inst = pprPanic "dictPred" (ppr inst)
160 getDictClassTys (Dict {tci_pred = pred}) = getClassPredTys pred
161 getDictClassTys inst = pprPanic "getDictClassTys" (ppr inst)
163 -- fdPredsOfInst is used to get predicates that contain functional
164 -- dependencies *or* might do so. The "might do" part is because
165 -- a constraint (C a b) might have a superclass with FDs
166 -- Leaving these in is really important for the call to fdPredsOfInsts
167 -- in TcSimplify.inferLoop, because the result is fed to 'grow',
168 -- which is supposed to be conservative
169 fdPredsOfInst (Dict {tci_pred = pred}) = [pred]
170 fdPredsOfInst (Method {tci_theta = theta}) = theta
171 fdPredsOfInst (ImplicInst {tci_given = gs,
172 tci_wanted = ws}) = fdPredsOfInsts (gs ++ ws)
173 fdPredsOfInst (LitInst {}) = []
174 fdPredsOfInst (EqInst {}) = []
176 fdPredsOfInsts :: [Inst] -> [PredType]
177 fdPredsOfInsts insts = concatMap fdPredsOfInst insts
179 isInheritableInst (Dict {tci_pred = pred}) = isInheritablePred pred
180 isInheritableInst (Method {tci_theta = theta}) = all isInheritablePred theta
181 isInheritableInst other = True
184 ---------------------------------
185 -- Get the implicit parameters mentioned by these Insts
186 -- NB: the results of these functions are insensitive to zonking
188 ipNamesOfInsts :: [Inst] -> [Name]
189 ipNamesOfInst :: Inst -> [Name]
190 ipNamesOfInsts insts = [n | inst <- insts, n <- ipNamesOfInst inst]
192 ipNamesOfInst (Dict {tci_pred = IParam n _}) = [ipNameName n]
193 ipNamesOfInst (Method {tci_theta = theta}) = [ipNameName n | IParam n _ <- theta]
194 ipNamesOfInst other = []
196 ---------------------------------
197 tyVarsOfInst :: Inst -> TcTyVarSet
198 tyVarsOfInst (LitInst {tci_ty = ty}) = tyVarsOfType ty
199 tyVarsOfInst (Dict {tci_pred = pred}) = tyVarsOfPred pred
200 tyVarsOfInst (Method {tci_oid = id, tci_tys = tys}) = tyVarsOfTypes tys `unionVarSet` varTypeTyVars id
201 -- The id might have free type variables; in the case of
202 -- locally-overloaded class methods, for example
203 tyVarsOfInst (ImplicInst {tci_tyvars = tvs, tci_given = givens, tci_wanted = wanteds})
204 = (tyVarsOfInsts givens `unionVarSet` tyVarsOfInsts wanteds)
205 `minusVarSet` mkVarSet tvs
206 `unionVarSet` unionVarSets (map varTypeTyVars tvs)
207 -- Remember the free tyvars of a coercion
208 tyVarsOfInst (EqInst {tci_left = ty1, tci_right = ty2}) = tyVarsOfType ty1 `unionVarSet` tyVarsOfType ty2
210 tyVarsOfInsts insts = foldr (unionVarSet . tyVarsOfInst) emptyVarSet insts
211 tyVarsOfLIE lie = tyVarsOfInsts (lieToList lie)
214 --------------------------
215 instToDictBind :: Inst -> LHsExpr TcId -> TcDictBinds
216 instToDictBind inst rhs
217 = unitBag (L (instSpan inst) (VarBind (instToId inst) rhs))
219 addInstToDictBind :: TcDictBinds -> Inst -> LHsExpr TcId -> TcDictBinds
220 addInstToDictBind binds inst rhs = binds `unionBags` instToDictBind inst rhs
227 isAbstractableInst :: Inst -> Bool
228 isAbstractableInst inst = isDict inst || isEqInst inst
230 isEqInst :: Inst -> Bool
231 isEqInst (EqInst {}) = True
232 isEqInst other = False
234 isDict :: Inst -> Bool
235 isDict (Dict {}) = True
238 isClassDict :: Inst -> Bool
239 isClassDict (Dict {tci_pred = pred}) = isClassPred pred
240 isClassDict other = False
242 isTyVarDict :: Inst -> Bool
243 isTyVarDict (Dict {tci_pred = pred}) = isTyVarClassPred pred
244 isTyVarDict other = False
246 isIPDict :: Inst -> Bool
247 isIPDict (Dict {tci_pred = pred}) = isIPPred pred
248 isIPDict other = False
250 isImplicInst (ImplicInst {}) = True
251 isImplicInst other = False
253 isMethod :: Inst -> Bool
254 isMethod (Method {}) = True
255 isMethod other = False
257 isMethodFor :: TcIdSet -> Inst -> Bool
258 isMethodFor ids (Method {tci_oid = id}) = id `elemVarSet` ids
259 isMethodFor ids inst = False
261 isMethodOrLit :: Inst -> Bool
262 isMethodOrLit (Method {}) = True
263 isMethodOrLit (LitInst {}) = True
264 isMethodOrLit other = False
268 %************************************************************************
270 \subsection{Building dictionaries}
272 %************************************************************************
274 -- newDictBndrs makes a dictionary at a binding site
275 -- instCall makes a dictionary at an occurrence site
276 -- and throws it into the LIE
280 newDictBndrsO :: InstOrigin -> TcThetaType -> TcM [Inst]
281 newDictBndrsO orig theta = do { loc <- getInstLoc orig
282 ; newDictBndrs loc theta }
284 newDictBndrs :: InstLoc -> TcThetaType -> TcM [Inst]
285 newDictBndrs inst_loc theta = mapM (newDictBndr inst_loc) theta
287 newDictBndr :: InstLoc -> TcPredType -> TcM Inst
288 newDictBndr inst_loc pred@(EqPred ty1 ty2)
289 = do { uniq <- newUnique
290 ; let name = mkPredName uniq inst_loc pred
291 ; return (EqInst {tci_name = name,
295 tci_co = mkGivenCo $ TyVarTy (Var.mkCoVar name (PredTy pred))})
297 newDictBndr inst_loc pred
298 = do { uniq <- newUnique
299 ; let name = mkPredName uniq inst_loc pred
300 ; return (Dict {tci_name = name, tci_pred = pred, tci_loc = inst_loc}) }
303 instCall :: InstOrigin -> [TcType] -> TcThetaType -> TcM HsWrapper
304 -- Instantiate the constraints of a call
305 -- (instCall o tys theta)
306 -- (a) Makes fresh dictionaries as necessary for the constraints (theta)
307 -- (b) Throws these dictionaries into the LIE
308 -- (c) Returns an HsWrapper ([.] tys dicts)
310 instCall orig tys theta
311 = do { loc <- getInstLoc orig
312 ; dict_app <- instCallDicts loc theta
313 ; return (dict_app <.> mkWpTyApps tys) }
316 instStupidTheta :: InstOrigin -> TcThetaType -> TcM ()
317 -- Similar to instCall, but only emit the constraints in the LIE
318 -- Used exclusively for the 'stupid theta' of a data constructor
319 instStupidTheta orig theta
320 = do { loc <- getInstLoc orig
321 ; _co <- instCallDicts loc theta -- Discard the coercion
325 instCallDicts :: InstLoc -> TcThetaType -> TcM HsWrapper
326 -- Instantiates the TcTheta, puts all constraints thereby generated
327 -- into the LIE, and returns a HsWrapper to enclose the call site.
328 -- This is the key place where equality predicates
329 -- are unleashed into the world
330 instCallDicts loc [] = return idHsWrapper
332 -- instCallDicts loc (EqPred ty1 ty2 : preds)
333 -- = do { unifyType ty1 ty2 -- For now, we insist that they unify right away
334 -- -- Later on, when we do associated types,
335 -- -- unifyType :: Type -> Type -> TcM ([Inst], Coercion)
336 -- ; (dicts, co_fn) <- instCallDicts loc preds
337 -- ; return (dicts, co_fn <.> WpTyApp ty1) }
338 -- -- We use type application to apply the function to the
339 -- -- coercion; here ty1 *is* the appropriate identity coercion
341 instCallDicts loc (EqPred ty1 ty2 : preds)
342 = do { traceTc (text "instCallDicts" <+> ppr (EqPred ty1 ty2))
343 ; coi <- boxyUnify ty1 ty2
344 -- ; coi <- unifyType ty1 ty2
345 ; let co = fromCoI coi ty1
346 ; co_fn <- instCallDicts loc preds
347 ; return (co_fn <.> WpTyApp co) }
349 instCallDicts loc (pred : preds)
350 = do { uniq <- newUnique
351 ; let name = mkPredName uniq loc pred
352 dict = Dict {tci_name = name, tci_pred = pred, tci_loc = loc}
354 ; co_fn <- instCallDicts loc preds
355 ; return (co_fn <.> WpApp (instToId dict)) }
358 cloneDict :: Inst -> TcM Inst
359 cloneDict dict@(Dict nm ty loc) = do { uniq <- newUnique
360 ; return (dict {tci_name = setNameUnique nm uniq}) }
361 cloneDict eq@(EqInst {}) = return eq
362 cloneDict other = pprPanic "cloneDict" (ppr other)
364 -- For vanilla implicit parameters, there is only one in scope
365 -- at any time, so we used to use the name of the implicit parameter itself
366 -- But with splittable implicit parameters there may be many in
367 -- scope, so we make up a new namea.
368 newIPDict :: InstOrigin -> IPName Name -> Type
369 -> TcM (IPName Id, Inst)
370 newIPDict orig ip_name ty = do
371 inst_loc <- getInstLoc orig
374 pred = IParam ip_name ty
375 name = mkPredName uniq inst_loc pred
376 dict = Dict {tci_name = name, tci_pred = pred, tci_loc = inst_loc}
378 return (mapIPName (\n -> instToId dict) ip_name, dict)
383 mkPredName :: Unique -> InstLoc -> PredType -> Name
384 mkPredName uniq loc pred_ty
385 = mkInternalName uniq occ (instLocSpan loc)
387 occ = case pred_ty of
388 ClassP cls _ -> mkDictOcc (getOccName cls)
389 IParam ip _ -> getOccName (ipNameName ip)
390 EqPred ty _ -> mkEqPredCoOcc baseOcc
392 -- we use the outermost tycon of the lhs, if there is one, to
393 -- improve readability of Core code
394 baseOcc = case splitTyConApp_maybe ty of
395 Nothing -> mkOccName tcName "$"
396 Just (tc, _) -> getOccName tc
399 %************************************************************************
401 \subsection{Building methods (calls of overloaded functions)}
403 %************************************************************************
407 newMethodFromName :: InstOrigin -> BoxyRhoType -> Name -> TcM TcId
408 newMethodFromName origin ty name = do
409 id <- tcLookupId name
410 -- Use tcLookupId not tcLookupGlobalId; the method is almost
411 -- always a class op, but with -fno-implicit-prelude GHC is
412 -- meant to find whatever thing is in scope, and that may
413 -- be an ordinary function.
414 loc <- getInstLoc origin
415 inst <- tcInstClassOp loc id [ty]
417 return (instToId inst)
419 newMethodWithGivenTy orig id tys = do
420 loc <- getInstLoc orig
421 inst <- newMethod loc id tys
423 return (instToId inst)
425 --------------------------------------------
426 -- tcInstClassOp, and newMethod do *not* drop the
427 -- Inst into the LIE; they just returns the Inst
428 -- This is important because they are used by TcSimplify
431 -- NB: the kind of the type variable to be instantiated
432 -- might be a sub-kind of the type to which it is applied,
433 -- notably when the latter is a type variable of kind ??
434 -- Hence the call to checkKind
435 -- A worry: is this needed anywhere else?
436 tcInstClassOp :: InstLoc -> Id -> [TcType] -> TcM Inst
437 tcInstClassOp inst_loc sel_id tys = do
439 (tyvars, _rho) = tcSplitForAllTys (idType sel_id)
440 zipWithM_ checkKind tyvars tys
441 newMethod inst_loc sel_id tys
443 checkKind :: TyVar -> TcType -> TcM ()
444 -- Ensure that the type has a sub-kind of the tyvar
447 -- ty1 <- zonkTcType ty
448 ; if typeKind ty1 `isSubKind` Var.tyVarKind tv
452 pprPanic "checkKind: adding kind constraint"
453 (vcat [ppr tv <+> ppr (Var.tyVarKind tv),
454 ppr ty <+> ppr ty1 <+> ppr (typeKind ty1)])
456 -- do { tv1 <- tcInstTyVar tv
457 -- ; unifyType ty1 (mkTyVarTy tv1) } }
460 ---------------------------
461 newMethod inst_loc id tys = do
462 new_uniq <- newUnique
464 (theta,tau) = tcSplitPhiTy (applyTys (idType id) tys)
465 meth_id = mkUserLocal (mkMethodOcc (getOccName id)) new_uniq tau loc
466 inst = Method {tci_id = meth_id, tci_oid = id, tci_tys = tys,
467 tci_theta = theta, tci_loc = inst_loc}
468 loc = instLocSpan inst_loc
474 shortCutIntLit :: Integer -> TcType -> Maybe (HsExpr TcId)
476 | isIntTy ty && inIntRange i -- Short cut for Int
477 = Just (HsLit (HsInt i))
478 | isIntegerTy ty -- Short cut for Integer
479 = Just (HsLit (HsInteger i ty))
480 | otherwise = Nothing
482 shortCutFracLit :: Rational -> TcType -> Maybe (HsExpr TcId)
485 = Just (mk_lit floatDataCon (HsFloatPrim f))
487 = Just (mk_lit doubleDataCon (HsDoublePrim f))
488 | otherwise = Nothing
490 mk_lit con lit = HsApp (nlHsVar (dataConWrapId con)) (nlHsLit lit)
492 shortCutStringLit :: FastString -> TcType -> Maybe (HsExpr TcId)
493 shortCutStringLit s ty
494 | isStringTy ty -- Short cut for String
495 = Just (HsLit (HsString s))
496 | otherwise = Nothing
498 mkIntegerLit :: Integer -> TcM (LHsExpr TcId)
500 integer_ty <- tcMetaTy integerTyConName
502 return (L span $ HsLit (HsInteger i integer_ty))
504 mkRatLit :: Rational -> TcM (LHsExpr TcId)
506 rat_ty <- tcMetaTy rationalTyConName
508 return (L span $ HsLit (HsRat r rat_ty))
510 mkStrLit :: FastString -> TcM (LHsExpr TcId)
512 --string_ty <- tcMetaTy stringTyConName
514 return (L span $ HsLit (HsString s))
516 isHsVar :: HsExpr Name -> Name -> Bool
517 isHsVar (HsVar f) g = f==g
518 isHsVar other g = False
522 %************************************************************************
526 %************************************************************************
528 Zonking makes sure that the instance types are fully zonked.
531 zonkInst :: Inst -> TcM Inst
532 zonkInst dict@(Dict { tci_pred = pred}) = do
533 new_pred <- zonkTcPredType pred
534 return (dict {tci_pred = new_pred})
536 zonkInst meth@(Method {tci_oid = id, tci_tys = tys, tci_theta = theta}) = do
538 -- Essential to zonk the id in case it's a local variable
539 -- Can't use zonkIdOcc because the id might itself be
540 -- an InstId, in which case it won't be in scope
542 new_tys <- zonkTcTypes tys
543 new_theta <- zonkTcThetaType theta
544 return (meth { tci_oid = new_id, tci_tys = new_tys, tci_theta = new_theta })
545 -- No need to zonk the tci_id
547 zonkInst lit@(LitInst {tci_ty = ty}) = do
548 new_ty <- zonkTcType ty
549 return (lit {tci_ty = new_ty})
551 zonkInst implic@(ImplicInst {})
552 = ASSERT( all isImmutableTyVar (tci_tyvars implic) )
553 do { givens' <- zonkInsts (tci_given implic)
554 ; wanteds' <- zonkInsts (tci_wanted implic)
555 ; return (implic {tci_given = givens',tci_wanted = wanteds'}) }
557 zonkInst eqinst@(EqInst {tci_left = ty1, tci_right = ty2})
558 = do { co' <- eitherEqInst eqinst
559 (\covar -> return (mkWantedCo covar))
560 (\co -> liftM mkGivenCo $ zonkTcType co)
561 ; ty1' <- zonkTcType ty1
562 ; ty2' <- zonkTcType ty2
563 ; return (eqinst {tci_co = co', tci_left= ty1', tci_right = ty2' })
566 zonkInsts insts = mapM zonkInst insts
570 %************************************************************************
572 \subsection{Printing}
574 %************************************************************************
576 ToDo: improve these pretty-printing things. The ``origin'' is really only
577 relevant in error messages.
580 instance Outputable Inst where
581 ppr inst = pprInst inst
583 pprDictsTheta :: [Inst] -> SDoc
584 -- Print in type-like fashion (Eq a, Show b)
585 -- The Inst can be an implication constraint, but not a Method or LitInst
586 pprDictsTheta insts = parens (sep (punctuate comma (map (ppr . instType) insts)))
588 pprDictsInFull :: [Inst] -> SDoc
589 -- Print in type-like fashion, but with source location
591 = vcat (map go dicts)
593 go dict = sep [quotes (ppr (instType dict)), nest 2 (pprInstArising dict)]
595 pprInsts :: [Inst] -> SDoc
596 -- Debugging: print the evidence :: type
597 pprInsts insts = brackets (interpp'SP insts)
599 pprInst, pprInstInFull :: Inst -> SDoc
600 -- Debugging: print the evidence :: type
601 pprInst i@(EqInst {tci_left = ty1, tci_right = ty2, tci_co = co})
603 (\covar -> text "Wanted" <+> ppr (TyVarTy covar) <+> dcolon <+> ppr (EqPred ty1 ty2))
604 (\co -> text "Given" <+> ppr co <+> dcolon <+> ppr (EqPred ty1 ty2))
605 pprInst inst = ppr name <> braces (pprUnique (getUnique name)) <+> dcolon
606 <+> braces (ppr (instType inst) <> implicWantedEqs)
610 | isImplicInst inst = text " &" <+>
611 ppr (filter isEqInst (tci_wanted inst))
614 pprInstInFull inst@(EqInst {}) = pprInst inst
615 pprInstInFull inst = sep [quotes (pprInst inst), nest 2 (pprInstArising inst)]
617 tidyInst :: TidyEnv -> Inst -> Inst
618 tidyInst env eq@(EqInst {tci_left = lty, tci_right = rty, tci_co = co}) =
619 eq { tci_left = tidyType env lty
620 , tci_right = tidyType env rty
621 , tci_co = either Left (Right . tidyType env) co
623 tidyInst env lit@(LitInst {tci_ty = ty}) = lit {tci_ty = tidyType env ty}
624 tidyInst env dict@(Dict {tci_pred = pred}) = dict {tci_pred = tidyPred env pred}
625 tidyInst env meth@(Method {tci_tys = tys}) = meth {tci_tys = tidyTypes env tys}
626 tidyInst env implic@(ImplicInst {})
627 = implic { tci_tyvars = tvs'
628 , tci_given = map (tidyInst env') (tci_given implic)
629 , tci_wanted = map (tidyInst env') (tci_wanted implic) }
631 (env', tvs') = mapAccumL tidyTyVarBndr env (tci_tyvars implic)
633 tidyMoreInsts :: TidyEnv -> [Inst] -> (TidyEnv, [Inst])
634 -- This function doesn't assume that the tyvars are in scope
635 -- so it works like tidyOpenType, returning a TidyEnv
636 tidyMoreInsts env insts
637 = (env', map (tidyInst env') insts)
639 env' = tidyFreeTyVars env (tyVarsOfInsts insts)
641 tidyInsts :: [Inst] -> (TidyEnv, [Inst])
642 tidyInsts insts = tidyMoreInsts emptyTidyEnv insts
644 showLIE :: SDoc -> TcM () -- Debugging
646 = do { lie_var <- getLIEVar ;
647 lie <- readMutVar lie_var ;
648 traceTc (str <+> vcat (map pprInstInFull (lieToList lie))) }
652 %************************************************************************
654 Extending the instance environment
656 %************************************************************************
659 tcExtendLocalInstEnv :: [Instance] -> TcM a -> TcM a
660 -- Add new locally-defined instances
661 tcExtendLocalInstEnv dfuns thing_inside
662 = do { traceDFuns dfuns
664 ; inst_env' <- foldlM addLocalInst (tcg_inst_env env) dfuns
665 ; let env' = env { tcg_insts = dfuns ++ tcg_insts env,
666 tcg_inst_env = inst_env' }
667 ; setGblEnv env' thing_inside }
669 addLocalInst :: InstEnv -> Instance -> TcM InstEnv
670 -- Check that the proposed new instance is OK,
671 -- and then add it to the home inst env
672 addLocalInst home_ie ispec
673 = do { -- Instantiate the dfun type so that we extend the instance
674 -- envt with completely fresh template variables
675 -- This is important because the template variables must
676 -- not overlap with anything in the things being looked up
677 -- (since we do unification).
678 -- We use tcInstSkolType because we don't want to allocate fresh
679 -- *meta* type variables.
680 let dfun = instanceDFunId ispec
681 ; (tvs', theta', tau') <- tcInstSkolType InstSkol (idType dfun)
682 ; let (cls, tys') = tcSplitDFunHead tau'
683 dfun' = setIdType dfun (mkSigmaTy tvs' theta' tau')
684 ispec' = setInstanceDFunId ispec dfun'
686 -- Load imported instances, so that we report
687 -- duplicates correctly
689 ; let inst_envs = (eps_inst_env eps, home_ie)
691 -- Check functional dependencies
692 ; case checkFunDeps inst_envs ispec' of
693 Just specs -> funDepErr ispec' specs
696 -- Check for duplicate instance decls
697 ; let { (matches, _) = lookupInstEnv inst_envs cls tys'
698 ; dup_ispecs = [ dup_ispec
699 | (dup_ispec, _) <- matches
700 , let (_,_,_,dup_tys) = instanceHead dup_ispec
701 , isJust (tcMatchTys (mkVarSet tvs') tys' dup_tys)] }
702 -- Find memebers of the match list which ispec itself matches.
703 -- If the match is 2-way, it's a duplicate
705 dup_ispec : _ -> dupInstErr ispec' dup_ispec
708 -- OK, now extend the envt
709 ; return (extendInstEnv home_ie ispec') }
711 getOverlapFlag :: TcM OverlapFlag
713 = do { dflags <- getDOpts
714 ; let overlap_ok = dopt Opt_OverlappingInstances dflags
715 incoherent_ok = dopt Opt_IncoherentInstances dflags
716 overlap_flag | incoherent_ok = Incoherent
717 | overlap_ok = OverlapOk
718 | otherwise = NoOverlap
720 ; return overlap_flag }
723 = traceTc (hang (text "Adding instances:") 2 (vcat (map pp ispecs)))
725 pp ispec = ppr (instanceDFunId ispec) <+> colon <+> ppr ispec
726 -- Print the dfun name itself too
728 funDepErr ispec ispecs
730 addErr (hang (ptext SLIT("Functional dependencies conflict between instance declarations:"))
731 2 (pprInstances (ispec:ispecs)))
732 dupInstErr ispec dup_ispec
734 addErr (hang (ptext SLIT("Duplicate instance declarations:"))
735 2 (pprInstances [ispec, dup_ispec]))
737 addDictLoc ispec thing_inside
738 = setSrcSpan (mkSrcSpan loc loc) thing_inside
740 loc = getSrcLoc ispec
744 %************************************************************************
746 \subsection{Looking up Insts}
748 %************************************************************************
751 data LookupInstResult
753 | GenInst [Inst] (LHsExpr TcId) -- The expression and its needed insts
755 lookupSimpleInst :: Inst -> TcM LookupInstResult
756 -- This is "simple" in that it returns NoInstance for implication constraints
758 -- It's important that lookupInst does not put any new stuff into
759 -- the LIE. Instead, any Insts needed by the lookup are returned in
760 -- the LookupInstResult, where they can be further processed by tcSimplify
762 lookupSimpleInst (EqInst {}) = return NoInstance
764 --------------------- Implications ------------------------
765 lookupSimpleInst (ImplicInst {}) = return NoInstance
767 --------------------- Methods ------------------------
768 lookupSimpleInst (Method {tci_oid = id, tci_tys = tys, tci_theta = theta, tci_loc = loc})
769 = do { (dict_app, dicts) <- getLIE $ instCallDicts loc theta
770 ; let co_fn = dict_app <.> mkWpTyApps tys
771 ; return (GenInst dicts (L span $ HsWrap co_fn (HsVar id))) }
773 span = instLocSpan loc
775 --------------------- Literals ------------------------
776 -- Look for short cuts first: if the literal is *definitely* a
777 -- int, integer, float or a double, generate the real thing here.
778 -- This is essential (see nofib/spectral/nucleic).
779 -- [Same shortcut as in newOverloadedLit, but we
780 -- may have done some unification by now]
782 lookupSimpleInst (LitInst {tci_lit = HsIntegral i from_integer_name _, tci_ty = ty, tci_loc = loc})
783 | Just expr <- shortCutIntLit i ty
784 = return (GenInst [] (noLoc expr))
786 = ASSERT( from_integer_name `isHsVar` fromIntegerName ) do -- A LitInst invariant
787 from_integer <- tcLookupId fromIntegerName
788 method_inst <- tcInstClassOp loc from_integer [ty]
789 integer_lit <- mkIntegerLit i
790 return (GenInst [method_inst]
791 (mkHsApp (L (instLocSpan loc)
792 (HsVar (instToId method_inst))) integer_lit))
794 lookupSimpleInst (LitInst {tci_lit = HsFractional f from_rat_name _, tci_ty = ty, tci_loc = loc})
795 | Just expr <- shortCutFracLit f ty
796 = return (GenInst [] (noLoc expr))
799 = ASSERT( from_rat_name `isHsVar` fromRationalName ) do -- A LitInst invariant
800 from_rational <- tcLookupId fromRationalName
801 method_inst <- tcInstClassOp loc from_rational [ty]
802 rat_lit <- mkRatLit f
803 return (GenInst [method_inst] (mkHsApp (L (instLocSpan loc)
804 (HsVar (instToId method_inst))) rat_lit))
806 lookupSimpleInst (LitInst {tci_lit = HsIsString s from_string_name _, tci_ty = ty, tci_loc = loc})
807 | Just expr <- shortCutStringLit s ty
808 = return (GenInst [] (noLoc expr))
810 = ASSERT( from_string_name `isHsVar` fromStringName ) do -- A LitInst invariant
811 from_string <- tcLookupId fromStringName
812 method_inst <- tcInstClassOp loc from_string [ty]
813 string_lit <- mkStrLit s
814 return (GenInst [method_inst]
815 (mkHsApp (L (instLocSpan loc)
816 (HsVar (instToId method_inst))) string_lit))
818 --------------------- Dictionaries ------------------------
819 lookupSimpleInst (Dict {tci_pred = pred, tci_loc = loc})
820 = do { mb_result <- lookupPred pred
821 ; case mb_result of {
822 Nothing -> return NoInstance ;
823 Just (dfun_id, mb_inst_tys) -> do
825 { use_stage <- getStage
826 ; checkWellStaged (ptext SLIT("instance for") <+> quotes (ppr pred))
827 (topIdLvl dfun_id) use_stage
829 -- It's possible that not all the tyvars are in
830 -- the substitution, tenv. For example:
831 -- instance C X a => D X where ...
832 -- (presumably there's a functional dependency in class C)
833 -- Hence mb_inst_tys :: Either TyVar TcType
835 ; let inst_tv (Left tv) = do { tv' <- tcInstTyVar tv; return (mkTyVarTy tv') }
836 inst_tv (Right ty) = return ty
837 ; tys <- mapM inst_tv mb_inst_tys
839 (theta, _) = tcSplitPhiTy (applyTys (idType dfun_id) tys)
840 src_loc = instLocSpan loc
843 return (GenInst [] (L src_loc $ HsWrap (mkWpTyApps tys) dfun))
845 { (dict_app, dicts) <- getLIE $ instCallDicts loc theta -- !!!
846 ; let co_fn = dict_app <.> mkWpTyApps tys
847 ; return (GenInst dicts (L src_loc $ HsWrap co_fn dfun))
851 lookupPred :: TcPredType -> TcM (Maybe (DFunId, [Either TyVar TcType]))
852 -- Look up a class constraint in the instance environment
853 lookupPred pred@(ClassP clas tys)
855 ; tcg_env <- getGblEnv
856 ; let inst_envs = (eps_inst_env eps, tcg_inst_env tcg_env)
857 ; case lookupInstEnv inst_envs clas tys of {
858 ([(ispec, inst_tys)], [])
859 -> do { let dfun_id = is_dfun ispec
860 ; traceTc (text "lookupInst success" <+>
861 vcat [text "dict" <+> ppr pred,
862 text "witness" <+> ppr dfun_id
863 <+> ppr (idType dfun_id) ])
864 -- Record that this dfun is needed
865 ; record_dfun_usage dfun_id
866 ; return (Just (dfun_id, inst_tys)) } ;
869 -> do { traceTc (text "lookupInst fail" <+>
870 vcat [text "dict" <+> ppr pred,
871 text "matches" <+> ppr matches,
872 text "unifs" <+> ppr unifs])
873 -- In the case of overlap (multiple matches) we report
874 -- NoInstance here. That has the effect of making the
875 -- context-simplifier return the dict as an irreducible one.
876 -- Then it'll be given to addNoInstanceErrs, which will do another
877 -- lookupInstEnv to get the detailed info about what went wrong.
881 lookupPred ip_pred = return Nothing -- Implicit parameters
883 record_dfun_usage dfun_id
884 = do { hsc_env <- getTopEnv
885 ; let dfun_name = idName dfun_id
886 dfun_mod = nameModule dfun_name
887 ; if isInternalName dfun_name || -- Internal name => defined in this module
888 modulePackageId dfun_mod /= thisPackage (hsc_dflags hsc_env)
889 then return () -- internal, or in another package
890 else do { tcg_env <- getGblEnv
891 ; updMutVar (tcg_inst_uses tcg_env)
892 (`addOneToNameSet` idName dfun_id) }}
895 tcGetInstEnvs :: TcM (InstEnv, InstEnv)
896 -- Gets both the external-package inst-env
897 -- and the home-pkg inst env (includes module being compiled)
898 tcGetInstEnvs = do { eps <- getEps; env <- getGblEnv;
899 return (eps_inst_env eps, tcg_inst_env env) }
904 %************************************************************************
908 %************************************************************************
910 Suppose we are doing the -fno-implicit-prelude thing, and we encounter
911 a do-expression. We have to find (>>) in the current environment, which is
912 done by the rename. Then we have to check that it has the same type as
913 Control.Monad.(>>). Or, more precisely, a compatible type. One 'customer' had
916 (>>) :: HB m n mn => m a -> n b -> mn b
918 So the idea is to generate a local binding for (>>), thus:
920 let then72 :: forall a b. m a -> m b -> m b
921 then72 = ...something involving the user's (>>)...
923 ...the do-expression...
925 Now the do-expression can proceed using then72, which has exactly
928 In fact tcSyntaxName just generates the RHS for then72, because we only
929 want an actual binding in the do-expression case. For literals, we can
930 just use the expression inline.
933 tcSyntaxName :: InstOrigin
934 -> TcType -- Type to instantiate it at
935 -> (Name, HsExpr Name) -- (Standard name, user name)
936 -> TcM (Name, HsExpr TcId) -- (Standard name, suitable expression)
937 -- *** NOW USED ONLY FOR CmdTop (sigh) ***
938 -- NB: tcSyntaxName calls tcExpr, and hence can do unification.
939 -- So we do not call it from lookupInst, which is called from tcSimplify
941 tcSyntaxName orig ty (std_nm, HsVar user_nm)
943 = do id <- newMethodFromName orig ty std_nm
944 return (std_nm, HsVar id)
946 tcSyntaxName orig ty (std_nm, user_nm_expr) = do
947 std_id <- tcLookupId std_nm
949 -- C.f. newMethodAtLoc
950 ([tv], _, tau) = tcSplitSigmaTy (idType std_id)
951 sigma1 = substTyWith [tv] [ty] tau
952 -- Actually, the "tau-type" might be a sigma-type in the
953 -- case of locally-polymorphic methods.
955 addErrCtxtM (syntaxNameCtxt user_nm_expr orig sigma1) $ do
957 -- Check that the user-supplied thing has the
958 -- same type as the standard one.
959 -- Tiresome jiggling because tcCheckSigma takes a located expression
961 expr <- tcPolyExpr (L span user_nm_expr) sigma1
962 return (std_nm, unLoc expr)
964 syntaxNameCtxt name orig ty tidy_env = do
965 inst_loc <- getInstLoc orig
967 msg = vcat [ptext SLIT("When checking that") <+> quotes (ppr name) <+>
968 ptext SLIT("(needed by a syntactic construct)"),
969 nest 2 (ptext SLIT("has the required type:") <+> ppr (tidyType tidy_env ty)),
970 nest 2 (ptext SLIT("arising from") <+> pprInstLoc inst_loc)]
972 return (tidy_env, msg)
975 %************************************************************************
979 %************************************************************************
982 mkGivenCo :: Coercion -> Either TcTyVar Coercion
985 mkWantedCo :: TcTyVar -> Either TcTyVar Coercion
988 fromGivenCo :: Either TcTyVar Coercion -> Coercion
989 fromGivenCo (Right co) = co
990 fromGivenCo _ = panic "fromGivenCo: not a wanted coercion"
992 fromWantedCo :: String -> Either TcTyVar Coercion -> TcTyVar
993 fromWantedCo _ (Left covar) = covar
994 fromWantedCo msg _ = panic ("fromWantedCo: not a wanted coercion: " ++ msg)
996 eitherEqInst :: Inst -- given or wanted EqInst
997 -> (TcTyVar -> a) -- result if wanted
998 -> (Coercion -> a) -- result if given
1000 eitherEqInst (EqInst {tci_co = either_co}) withWanted withGiven
1002 Left covar -> withWanted covar
1003 Right co -> withGiven co
1005 mkEqInsts :: [PredType] -> [Either TcTyVar Coercion] -> TcM [Inst]
1006 mkEqInsts preds cos = zipWithM mkEqInst preds cos
1008 mkEqInst :: PredType -> Either TcTyVar Coercion -> TcM Inst
1009 mkEqInst (EqPred ty1 ty2) co
1010 = do { uniq <- newUnique
1011 ; src_span <- getSrcSpanM
1012 ; err_ctxt <- getErrCtxt
1013 ; let loc = InstLoc EqOrigin src_span err_ctxt
1014 name = mkName uniq src_span
1015 inst = EqInst {tci_left = ty1, tci_right = ty2, tci_co = co, tci_loc = loc, tci_name = name}
1018 where mkName uniq src_span = mkInternalName uniq (mkVarOcc "co") src_span
1020 mkWantedEqInst :: PredType -> TcM Inst
1021 mkWantedEqInst pred@(EqPred ty1 ty2)
1022 = do { cotv <- newMetaCoVar ty1 ty2
1023 ; mkEqInst pred (Left cotv)
1027 -- We want to promote the wanted EqInst to a given EqInst
1028 -- in the signature context.
1029 -- This means we have to give the coercion a name
1030 -- and fill it in as its own name.
1033 -> TcM Inst -- given
1034 finalizeEqInst wanted@(EqInst {tci_left = ty1, tci_right = ty2, tci_name = name})
1035 = do { let var = Var.mkCoVar name (PredTy $ EqPred ty1 ty2)
1036 ; writeWantedCoercion wanted (TyVarTy var)
1037 ; let given = wanted { tci_co = mkGivenCo $ TyVarTy var }
1042 :: Inst -- wanted EqInst
1043 -> Coercion -- coercion to fill the hole with
1045 writeWantedCoercion wanted co
1046 = do { let cotv = fromWantedCo "writeWantedCoercion" $ tci_co wanted
1047 ; writeMetaTyVar cotv co
1050 eqInstType :: Inst -> TcType
1051 eqInstType inst = eitherEqInst inst mkTyVarTy id
1053 eqInstCoercion :: Inst -> Either TcTyVar Coercion
1054 eqInstCoercion = tci_co
1056 eqInstTys :: Inst -> (TcType, TcType)
1057 eqInstTys inst = (tci_left inst, tci_right inst)
1059 updateEqInstCoercion :: (Either TcTyVar Coercion -> Either TcTyVar Coercion) -> Inst -> Inst
1060 updateEqInstCoercion f inst = inst {tci_co = f $ tci_co inst}