2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section[Inst]{The @Inst@ type: dictionaries or method instances}
8 LIE, emptyLIE, unitLIE, plusLIE, consLIE, zonkLIE,
9 plusLIEs, mkLIE, isEmptyLIE, lieToList, listToLIE,
11 Inst, OverloadedLit(..),
12 pprInst, pprInsts, pprInstsInFull, tidyInst, tidyInsts,
16 newDictFromOld, newDicts, newClassDicts, newDictsAtLoc,
17 newMethod, newMethodWithGivenTy, newOverloadedLit,
18 newIPDict, instOverloadedFun,
20 tyVarsOfInst, tyVarsOfInsts, tyVarsOfLIE, instLoc, getDictClassTys,
21 getFunDeps, getFunDepsOfLIE,
23 getAllFunDeps, getAllFunDepsOfLIE,
26 lookupInst, lookupSimpleInst, LookupInstResult(..),
28 isDict, isClassDict, isTyVarDict, isStdClassTyVarDict, isMethodFor, notFunDep,
29 instBindingRequired, instCanBeGeneralised,
31 zonkInst, zonkInsts, zonkFunDeps, zonkTvFunDeps,
32 instToId, instToIdBndr, ipToId,
34 InstOrigin(..), InstLoc, pprInstLoc
37 #include "HsVersions.h"
39 import HsSyn ( HsLit(..), HsExpr(..) )
40 import RnHsSyn ( RenamedArithSeqInfo, RenamedHsExpr, RenamedPat )
41 import TcHsSyn ( TcExpr, TcId,
42 mkHsTyApp, mkHsDictApp, mkHsDictLam, zonkId
45 import TcEnv ( TcIdSet, tcLookupValueByKey, tcLookupTyConByKey )
46 import TcType ( TcThetaType,
47 TcType, TcTauType, TcTyVarSet,
48 zonkTcTyVars, zonkTcType, zonkTcTypes,
52 import Class ( classInstEnv, Class )
53 import FunDeps ( instantiateFdClassTys )
54 import Id ( Id, idFreeTyVars, idType, mkUserLocal, mkSysLocal )
55 import PrelInfo ( isStandardClass, isCcallishClass, isNoDictClass )
56 import Name ( OccName, Name, mkDictOcc, mkMethodOcc, mkIPOcc,
57 getOccName, nameUnique )
58 import PprType ( pprPred )
59 import InstEnv ( InstEnv, lookupInstEnv )
60 import SrcLoc ( SrcLoc )
61 import Type ( Type, PredType(..), ThetaType,
62 mkTyVarTy, isTyVarTy, mkDictTy, mkPredTy,
63 splitForAllTys, splitSigmaTy,
64 splitRhoTy, tyVarsOfType, tyVarsOfTypes, tyVarsOfPred,
65 mkSynTy, tidyOpenType, tidyOpenTypes
67 import InstEnv ( InstEnv )
68 import Subst ( emptyInScopeSet, mkSubst,
69 substTy, substClasses, mkTyVarSubst, mkTopTyVarSubst
71 import TyCon ( TyCon )
73 import VarEnv ( lookupVarEnv, TidyEnv,
74 lookupSubstEnv, SubstResult(..)
76 import VarSet ( elemVarSet, emptyVarSet, unionVarSet )
77 import TysPrim ( intPrimTy, floatPrimTy, doublePrimTy )
78 import TysWiredIn ( intDataCon, isIntTy, inIntRange,
79 floatDataCon, isFloatTy,
80 doubleDataCon, isDoubleTy,
81 integerTy, isIntegerTy
83 import Unique ( fromRationalClassOpKey, rationalTyConKey,
84 fromIntClassOpKey, fromIntegerClassOpKey, Unique
86 import Maybes ( expectJust )
87 import List ( partition )
88 import Maybe ( catMaybes )
89 import Util ( thenCmp, zipWithEqual, mapAccumL )
93 %************************************************************************
95 \subsection[Inst-collections]{LIE: a collection of Insts}
97 %************************************************************************
102 isEmptyLIE = isEmptyBag
104 unitLIE inst = unitBag inst
105 mkLIE insts = listToBag insts
106 plusLIE lie1 lie2 = lie1 `unionBags` lie2
107 consLIE inst lie = inst `consBag` lie
108 plusLIEs lies = unionManyBags lies
109 lieToList = bagToList
110 listToLIE = listToBag
112 zonkLIE :: LIE -> NF_TcM s LIE
113 zonkLIE lie = mapBagNF_Tc zonkInst lie
115 pprInsts :: [Inst] -> SDoc
116 pprInsts insts = parens (sep (punctuate comma (map pprInst insts)))
120 = vcat (map go insts)
122 go inst = quotes (ppr inst) <+> pprInstLoc (instLoc inst)
125 %************************************************************************
127 \subsection[Inst-types]{@Inst@ types}
129 %************************************************************************
131 An @Inst@ is either a dictionary, an instance of an overloaded
132 literal, or an instance of an overloaded value. We call the latter a
133 ``method'' even though it may not correspond to a class operation.
134 For example, we might have an instance of the @double@ function at
135 type Int, represented by
137 Method 34 doubleId [Int] origin
149 TcId -- The overloaded function
150 -- This function will be a global, local, or ClassOpId;
151 -- inside instance decls (only) it can also be an InstId!
152 -- The id needn't be completely polymorphic.
153 -- You'll probably find its name (for documentation purposes)
154 -- inside the InstOrigin
156 [TcType] -- The types to which its polymorphic tyvars
157 -- should be instantiated.
158 -- These types must saturate the Id's foralls.
160 TcThetaType -- The (types of the) dictionaries to which the function
161 -- must be applied to get the method
163 TcTauType -- The type of the method
167 -- INVARIANT: in (Method u f tys theta tau loc)
168 -- type of (f tys dicts(from theta)) = tau
173 TcType -- The type at which the literal is used
177 Class -- the class from which this arises
178 [([TcType], [TcType])]
182 = OverloadedIntegral Integer -- The number
183 | OverloadedFractional Rational -- The number
188 @Insts@ are ordered by their class/type info, rather than by their
189 unique. This allows the context-reduction mechanism to use standard finite
190 maps to do their stuff.
193 instance Ord Inst where
195 instance Ord PredType where
198 instance Eq Inst where
199 (==) i1 i2 = case i1 `cmpInst` i2 of
202 instance Eq PredType where
203 (==) p1 p2 = case p1 `cmpPred` p2 of
207 cmpInst (Dict _ pred1 _) (Dict _ pred2 _)
208 = (pred1 `cmpPred` pred2)
209 cmpInst (Dict _ _ _) other
212 cmpInst (Method _ _ _ _ _ _) (Dict _ _ _)
214 cmpInst (Method _ id1 tys1 _ _ _) (Method _ id2 tys2 _ _ _)
215 = (id1 `compare` id2) `thenCmp` (tys1 `compare` tys2)
216 cmpInst (Method _ _ _ _ _ _) other
219 cmpInst (LitInst _ lit1 ty1 _) (LitInst _ lit2 ty2 _)
220 = (lit1 `cmpOverLit` lit2) `thenCmp` (ty1 `compare` ty2)
221 cmpInst (LitInst _ _ _ _) (FunDep _ _ _)
223 cmpInst (LitInst _ _ _ _) other
226 cmpInst (FunDep clas1 fds1 _) (FunDep clas2 fds2 _)
227 = (clas1 `compare` clas2) `thenCmp` (fds1 `compare` fds2)
228 cmpInst (FunDep _ _ _) other
231 cmpPred (Class c1 tys1) (Class c2 tys2)
232 = (c1 `compare` c2) `thenCmp` (tys1 `compare` tys2)
233 cmpPred (IParam n1 ty1) (IParam n2 ty2)
234 = (n1 `compare` n2) `thenCmp` (ty1 `compare` ty2)
235 cmpPred (Class _ _) (IParam _ _) = LT
238 cmpOverLit (OverloadedIntegral i1) (OverloadedIntegral i2) = i1 `compare` i2
239 cmpOverLit (OverloadedFractional f1) (OverloadedFractional f2) = f1 `compare` f2
240 cmpOverLit (OverloadedIntegral _) (OverloadedFractional _) = LT
241 cmpOverLit (OverloadedFractional _) (OverloadedIntegral _) = GT
248 instLoc (Dict u pred loc) = loc
249 instLoc (Method u _ _ _ _ loc) = loc
250 instLoc (LitInst u lit ty loc) = loc
251 instLoc (FunDep _ _ loc) = loc
253 getDictClassTys (Dict u (Class clas tys) _) = (clas, tys)
255 getFunDeps (FunDep clas fds _) = Just (clas, fds)
256 getFunDeps _ = Nothing
258 getFunDepsOfLIE lie = catMaybes (map getFunDeps (lieToList lie))
260 getIPsOfPred (IParam n ty) = [(n, ty)]
262 getIPsOfTheta theta = concatMap getIPsOfPred theta
264 getIPs (Dict u (IParam n ty) loc) = [(n, ty)]
265 getIPs (Method u id _ theta t loc) = getIPsOfTheta theta
268 getIPsOfLIE lie = concatMap getIPs (lieToList lie)
270 getAllFunDeps (FunDep clas fds _) = fds
271 getAllFunDeps inst = map (\(n,ty) -> ([], [ty])) (getIPs inst)
273 getAllFunDepsOfLIE lie = concat (map getAllFunDeps (lieToList lie))
275 partitionLIEbyMeth pred lie
276 = foldlTc (partMethod pred) (emptyLIE, emptyLIE) insts
277 where insts = lieToList lie
279 partMethod pred (ips, lie) d@(Dict _ p _)
281 returnTc (consLIE d ips, lie)
283 returnTc (ips, consLIE d lie)
285 partMethod pred (ips, lie) m@(Method u id tys theta tau loc@(_,sloc,_))
286 = let (ips_, theta_) = partition pred theta in
288 returnTc (ips, consLIE m lie)
289 else if null theta_ then
290 returnTc (consLIE m ips, lie)
292 zonkPreds theta_ `thenTc` \ theta_' ->
293 newDictsAtLoc loc theta_' `thenTc` \ (new_dicts, _) ->
294 returnTc (consLIE m ips,
295 plusLIE (listToLIE new_dicts) lie)
297 partMethod pred (ips, lie) inst@(LitInst u lit ty loc)
298 = returnTc (ips, consLIE inst lie)
300 tyVarsOfInst :: Inst -> TcTyVarSet
301 tyVarsOfInst (Dict _ pred _) = tyVarsOfPred pred
302 tyVarsOfInst (Method _ id tys _ _ _) = tyVarsOfTypes tys `unionVarSet` idFreeTyVars id
303 -- The id might have free type variables; in the case of
304 -- locally-overloaded class methods, for example
305 tyVarsOfInst (LitInst _ _ ty _) = tyVarsOfType ty
306 tyVarsOfInst (FunDep _ fds _)
307 = foldr unionVarSet emptyVarSet (map tyVarsOfFd fds)
308 where tyVarsOfFd (ts1, ts2) =
309 tyVarsOfTypes ts1 `unionVarSet` tyVarsOfTypes ts2
312 = foldr unionVarSet emptyVarSet (map tyVarsOfInst insts)
315 = foldr unionVarSet emptyVarSet (map tyVarsOfInst insts)
316 where insts = lieToList lie
322 isDict :: Inst -> Bool
323 isDict (Dict _ _ _) = True
325 isClassDict :: Inst -> Bool
326 isClassDict (Dict _ (Class _ _) _) = True
327 isClassDict other = False
329 isMethodFor :: TcIdSet -> Inst -> Bool
330 isMethodFor ids (Method uniq id tys _ _ loc)
331 = id `elemVarSet` ids
335 isTyVarDict :: Inst -> Bool
336 isTyVarDict (Dict _ (Class _ tys) _) = all isTyVarTy tys
337 isTyVarDict other = False
339 isStdClassTyVarDict (Dict _ (Class clas [ty]) _)
340 = isStandardClass clas && isTyVarTy ty
341 isStdClassTyVarDict other
344 notFunDep :: Inst -> Bool
345 notFunDep (FunDep _ _ _) = False
346 notFunDep other = True
349 Two predicates which deal with the case where class constraints don't
350 necessarily result in bindings. The first tells whether an @Inst@
351 must be witnessed by an actual binding; the second tells whether an
352 @Inst@ can be generalised over.
355 instBindingRequired :: Inst -> Bool
356 instBindingRequired (Dict _ (Class clas _) _) = not (isNoDictClass clas)
357 instBindingRequired (Dict _ (IParam _ _) _) = False
358 instBindingRequired other = True
360 instCanBeGeneralised :: Inst -> Bool
361 instCanBeGeneralised (Dict _ (Class clas _) _) = not (isCcallishClass clas)
362 instCanBeGeneralised other = True
370 newDicts :: InstOrigin
372 -> NF_TcM s (LIE, [TcId])
374 = tcGetInstLoc orig `thenNF_Tc` \ loc ->
375 newDictsAtLoc loc theta `thenNF_Tc` \ (dicts, ids) ->
376 returnNF_Tc (listToBag dicts, ids)
378 newClassDicts :: InstOrigin
379 -> [(Class,[TcType])]
380 -> NF_TcM s (LIE, [TcId])
381 newClassDicts orig theta
382 = newDicts orig (map (uncurry Class) theta)
384 -- Local function, similar to newDicts,
385 -- but with slightly different interface
386 newDictsAtLoc :: InstLoc
388 -> NF_TcM s ([Inst], [TcId])
389 newDictsAtLoc loc theta =
390 tcGetUniques (length theta) `thenNF_Tc` \ new_uniqs ->
392 mk_dict u pred = Dict u pred loc
393 dicts = zipWithEqual "newDictsAtLoc" mk_dict new_uniqs theta
395 returnNF_Tc (dicts, map instToId dicts)
397 newDictFromOld :: Inst -> Class -> [TcType] -> NF_TcM s Inst
398 newDictFromOld (Dict _ _ loc) clas tys
399 = tcGetUnique `thenNF_Tc` \ uniq ->
400 returnNF_Tc (Dict uniq (Class clas tys) loc)
403 newMethod :: InstOrigin
406 -> NF_TcM s (LIE, TcId)
407 newMethod orig id tys
408 = -- Get the Id type and instantiate it at the specified types
410 (tyvars, rho) = splitForAllTys (idType id)
411 rho_ty = substTy (mkTyVarSubst tyvars tys) rho
412 (theta, tau) = splitRhoTy rho_ty
414 newMethodWithGivenTy orig id tys theta tau `thenNF_Tc` \ meth_inst ->
415 returnNF_Tc (unitLIE meth_inst, instToId meth_inst)
417 instOverloadedFun orig (HsVar v) arg_tys theta tau
418 = newMethodWithGivenTy orig v arg_tys theta tau `thenNF_Tc` \ inst ->
419 instFunDeps orig theta `thenNF_Tc` \ fds ->
420 returnNF_Tc (HsVar (instToId inst), mkLIE (inst : fds))
422 instFunDeps orig theta
423 = tcGetInstLoc orig `thenNF_Tc` \ loc ->
424 let ifd (Class clas tys) =
425 let fds = instantiateFdClassTys clas tys in
426 if null fds then Nothing else Just (FunDep clas fds loc)
428 in returnNF_Tc (catMaybes (map ifd theta))
430 newMethodWithGivenTy orig id tys theta tau
431 = tcGetInstLoc orig `thenNF_Tc` \ loc ->
432 newMethodWith id tys theta tau loc
434 newMethodWith id tys theta tau loc
435 = tcGetUnique `thenNF_Tc` \ new_uniq ->
436 returnNF_Tc (Method new_uniq id tys theta tau loc)
438 newMethodAtLoc :: InstLoc
440 -> NF_TcM s (Inst, TcId)
441 newMethodAtLoc loc real_id tys -- Local function, similar to newMethod but with
442 -- slightly different interface
443 = -- Get the Id type and instantiate it at the specified types
444 tcGetUnique `thenNF_Tc` \ new_uniq ->
446 (tyvars,rho) = splitForAllTys (idType real_id)
447 rho_ty = ASSERT( length tyvars == length tys )
448 substTy (mkTopTyVarSubst tyvars tys) rho
449 (theta, tau) = splitRhoTy rho_ty
450 meth_inst = Method new_uniq real_id tys theta tau loc
452 returnNF_Tc (meth_inst, instToId meth_inst)
455 In newOverloadedLit we convert directly to an Int or Integer if we
456 know that's what we want. This may save some time, by not
457 temporarily generating overloaded literals, but it won't catch all
458 cases (the rest are caught in lookupInst).
461 newOverloadedLit :: InstOrigin
464 -> NF_TcM s (TcExpr, LIE)
465 newOverloadedLit orig (OverloadedIntegral i) ty
466 | isIntTy ty && inIntRange i -- Short cut for Int
467 = returnNF_Tc (int_lit, emptyLIE)
469 | isIntegerTy ty -- Short cut for Integer
470 = returnNF_Tc (integer_lit, emptyLIE)
473 intprim_lit = HsLitOut (HsIntPrim i) intPrimTy
474 integer_lit = HsLitOut (HsInt i) integerTy
475 int_lit = HsCon intDataCon [] [intprim_lit]
477 newOverloadedLit orig lit ty -- The general case
478 = tcGetInstLoc orig `thenNF_Tc` \ loc ->
479 tcGetUnique `thenNF_Tc` \ new_uniq ->
481 lit_inst = LitInst new_uniq lit ty loc
483 returnNF_Tc (HsVar (instToId lit_inst), unitLIE lit_inst)
487 newIPDict name ty loc
488 = tcGetUnique `thenNF_Tc` \ new_uniq ->
489 let d = Dict new_uniq (IParam name ty) loc in
494 instToId :: Inst -> TcId
495 instToId inst = instToIdBndr inst
497 instToIdBndr :: Inst -> TcId
498 instToIdBndr (Dict u (Class clas ty) (_,loc,_))
499 = mkUserLocal (mkDictOcc (getOccName clas)) u (mkDictTy clas ty) loc
500 instToIdBndr (Dict u (IParam n ty) (_,loc,_))
503 instToIdBndr (Method u id tys theta tau (_,loc,_))
504 = mkUserLocal (mkMethodOcc (getOccName id)) u tau loc
506 instToIdBndr (LitInst u list ty loc)
507 = mkSysLocal SLIT("lit") u ty
509 instToIdBndr (FunDep clas fds _)
510 = panic "FunDep escaped!!!"
513 = mkUserLocal (mkIPOcc (getOccName n)) (nameUnique n) (mkPredTy (IParam n ty)) loc
519 Zonking makes sure that the instance types are fully zonked,
520 but doesn't do the same for the Id in a Method. There's no
521 need, and it's a lot of extra work.
524 zonkPred :: TcPredType -> NF_TcM s TcPredType
525 zonkPred (Class clas tys)
526 = zonkTcTypes tys `thenNF_Tc` \ new_tys ->
527 returnNF_Tc (Class clas new_tys)
528 zonkPred (IParam n ty)
529 = zonkTcType ty `thenNF_Tc` \ new_ty ->
530 returnNF_Tc (IParam n new_ty)
532 zonkInst :: Inst -> NF_TcM s Inst
533 zonkInst (Dict u pred loc)
534 = zonkPred pred `thenNF_Tc` \ new_pred ->
535 returnNF_Tc (Dict u new_pred loc)
537 zonkInst (Method u id tys theta tau loc)
538 = zonkId id `thenNF_Tc` \ new_id ->
539 -- Essential to zonk the id in case it's a local variable
540 -- Can't use zonkIdOcc because the id might itself be
541 -- an InstId, in which case it won't be in scope
543 zonkTcTypes tys `thenNF_Tc` \ new_tys ->
544 zonkTcThetaType theta `thenNF_Tc` \ new_theta ->
545 zonkTcType tau `thenNF_Tc` \ new_tau ->
546 returnNF_Tc (Method u new_id new_tys new_theta new_tau loc)
548 zonkInst (LitInst u lit ty loc)
549 = zonkTcType ty `thenNF_Tc` \ new_ty ->
550 returnNF_Tc (LitInst u lit new_ty loc)
552 zonkInst (FunDep clas fds loc)
553 = zonkFunDeps fds `thenNF_Tc` \ fds' ->
554 returnNF_Tc (FunDep clas fds' loc)
556 zonkPreds preds = mapNF_Tc zonkPred preds
557 zonkInsts insts = mapNF_Tc zonkInst insts
559 zonkFunDeps fds = mapNF_Tc zonkFd fds
562 = zonkTcTypes ts1 `thenNF_Tc` \ ts1' ->
563 zonkTcTypes ts2 `thenNF_Tc` \ ts2' ->
564 returnNF_Tc (ts1', ts2')
566 zonkTvFunDeps fds = mapNF_Tc zonkFd fds
569 = zonkTcTyVars tvs1 `thenNF_Tc` \ tvs1' ->
570 zonkTcTyVars tvs2 `thenNF_Tc` \ tvs2' ->
571 returnNF_Tc (tvs1', tvs2')
577 ToDo: improve these pretty-printing things. The ``origin'' is really only
578 relevant in error messages.
581 instance Outputable Inst where
582 ppr inst = pprInst inst
584 pprInst (LitInst u lit ty loc)
586 OverloadedIntegral i -> integer i
587 OverloadedFractional f -> rational f,
592 pprInst (Dict u pred loc) = pprPred pred <+> show_uniq u
594 pprInst m@(Method u id tys theta tau loc)
595 = hsep [ppr id, ptext SLIT("at"),
596 brackets (interppSP tys),
601 pprInst (FunDep clas fds loc)
602 = hsep [ppr clas, ppr fds]
604 tidyPred :: TidyEnv -> TcPredType -> (TidyEnv, TcPredType)
605 tidyPred env (Class clas tys)
606 = (env', Class clas tys')
608 (env', tys') = tidyOpenTypes env tys
609 tidyPred env (IParam n ty)
610 = (env', IParam n ty')
612 (env', ty') = tidyOpenType env ty
614 tidyInst :: TidyEnv -> Inst -> (TidyEnv, Inst)
615 tidyInst env (LitInst u lit ty loc)
616 = (env', LitInst u lit ty' loc)
618 (env', ty') = tidyOpenType env ty
620 tidyInst env (Dict u pred loc)
621 = (env', Dict u pred' loc)
623 (env', pred') = tidyPred env pred
625 tidyInst env (Method u id tys theta tau loc)
626 = (env', Method u id tys' theta tau loc)
627 -- Leave theta, tau alone cos we don't print them
629 (env', tys') = tidyOpenTypes env tys
631 -- this case shouldn't arise... (we never print fundeps)
632 tidyInst env fd@(FunDep clas fds loc)
635 tidyInsts env insts = mapAccumL tidyInst env insts
637 show_uniq u = ifPprDebug (text "{-" <> ppr u <> text "-}")
641 %************************************************************************
643 \subsection[InstEnv-types]{Type declarations}
645 %************************************************************************
648 type InstanceMapper = Class -> InstEnv
651 A @ClassInstEnv@ lives inside a class, and identifies all the instances
652 of that class. The @Id@ inside a ClassInstEnv mapping is the dfun for
655 There is an important consistency constraint between the @MatchEnv@s
656 in and the dfun @Id@s inside them: the free type variables of the
657 @Type@ key in the @MatchEnv@ must be a subset of the universally-quantified
658 type variables of the dfun. Thus, the @ClassInstEnv@ for @Eq@ might
659 contain the following entry:
661 [a] ===> dfun_Eq_List :: forall a. Eq a => Eq [a]
663 The "a" in the pattern must be one of the forall'd variables in
667 data LookupInstResult s
669 | SimpleInst TcExpr -- Just a variable, type application, or literal
670 | GenInst [Inst] TcExpr -- The expression and its needed insts
673 -> NF_TcM s (LookupInstResult s)
677 lookupInst dict@(Dict _ (Class clas tys) loc)
678 = case lookupInstEnv (ppr clas) (classInstEnv clas) tys of
682 subst = mkSubst (tyVarsOfTypes tys) tenv
683 (tyvars, rho) = splitForAllTys (idType dfun_id)
684 ty_args = map subst_tv tyvars
685 dfun_rho = substTy subst rho
686 (theta, tau) = splitRhoTy dfun_rho
687 ty_app = mkHsTyApp (HsVar dfun_id) ty_args
688 subst_tv tv = case lookupSubstEnv tenv tv of
689 Just (DoneTy ty) -> ty
690 -- tenv should bind all the tyvars
693 returnNF_Tc (SimpleInst ty_app)
695 newDictsAtLoc loc theta `thenNF_Tc` \ (dicts, dict_ids) ->
697 rhs = mkHsDictApp ty_app dict_ids
699 returnNF_Tc (GenInst dicts rhs)
701 Nothing -> returnNF_Tc NoInstance
702 lookupInst dict@(Dict _ _ loc) = returnNF_Tc NoInstance
706 lookupInst inst@(Method _ id tys theta _ loc)
707 = newDictsAtLoc loc theta `thenNF_Tc` \ (dicts, dict_ids) ->
708 returnNF_Tc (GenInst dicts (mkHsDictApp (mkHsTyApp (HsVar id) tys) dict_ids))
712 lookupInst inst@(LitInst u (OverloadedIntegral i) ty loc)
713 | isIntTy ty && in_int_range -- Short cut for Int
714 = returnNF_Tc (GenInst [] int_lit)
715 -- GenInst, not SimpleInst, because int_lit is actually a constructor application
717 | isIntegerTy ty -- Short cut for Integer
718 = returnNF_Tc (GenInst [] integer_lit)
720 | in_int_range -- It's overloaded but small enough to fit into an Int
721 = tcLookupValueByKey fromIntClassOpKey `thenNF_Tc` \ from_int ->
722 newMethodAtLoc loc from_int [ty] `thenNF_Tc` \ (method_inst, method_id) ->
723 returnNF_Tc (GenInst [method_inst] (HsApp (HsVar method_id) int_lit))
725 | otherwise -- Alas, it is overloaded and a big literal!
726 = tcLookupValueByKey fromIntegerClassOpKey `thenNF_Tc` \ from_integer ->
727 newMethodAtLoc loc from_integer [ty] `thenNF_Tc` \ (method_inst, method_id) ->
728 returnNF_Tc (GenInst [method_inst] (HsApp (HsVar method_id) integer_lit))
730 in_int_range = inIntRange i
731 intprim_lit = HsLitOut (HsIntPrim i) intPrimTy
732 integer_lit = HsLitOut (HsInt i) integerTy
733 int_lit = HsCon intDataCon [] [intprim_lit]
735 -- similar idea for overloaded floating point literals: if the literal is
736 -- *definitely* a float or a double, generate the real thing here.
737 -- This is essential (see nofib/spectral/nucleic).
739 lookupInst inst@(LitInst u (OverloadedFractional f) ty loc)
740 | isFloatTy ty = returnNF_Tc (GenInst [] float_lit)
741 | isDoubleTy ty = returnNF_Tc (GenInst [] double_lit)
744 = tcLookupValueByKey fromRationalClassOpKey `thenNF_Tc` \ from_rational ->
746 -- The type Rational isn't wired in so we have to conjure it up
747 tcLookupTyConByKey rationalTyConKey `thenNF_Tc` \ rational_tycon ->
749 rational_ty = mkSynTy rational_tycon []
750 rational_lit = HsLitOut (HsFrac f) rational_ty
752 newMethodAtLoc loc from_rational [ty] `thenNF_Tc` \ (method_inst, method_id) ->
753 returnNF_Tc (GenInst [method_inst] (HsApp (HsVar method_id) rational_lit))
756 floatprim_lit = HsLitOut (HsFloatPrim f) floatPrimTy
757 float_lit = HsCon floatDataCon [] [floatprim_lit]
758 doubleprim_lit = HsLitOut (HsDoublePrim f) doublePrimTy
759 double_lit = HsCon doubleDataCon [] [doubleprim_lit]
761 -- there are no `instances' of functional dependencies or implicit params
763 lookupInst _ = returnNF_Tc NoInstance
767 There is a second, simpler interface, when you want an instance of a
768 class at a given nullary type constructor. It just returns the
769 appropriate dictionary if it exists. It is used only when resolving
770 ambiguous dictionaries.
773 lookupSimpleInst :: InstEnv
775 -> [Type] -- Look up (c,t)
776 -> NF_TcM s (Maybe [(Class,[Type])]) -- Here are the needed (c,t)s
778 lookupSimpleInst class_inst_env clas tys
779 = case lookupInstEnv (ppr clas) class_inst_env tys of
780 Nothing -> returnNF_Tc Nothing
783 -> returnNF_Tc (Just (substClasses (mkSubst emptyInScopeSet tenv) theta'))
785 (_, theta, _) = splitSigmaTy (idType dfun)
786 theta' = map (\(Class clas tys) -> (clas,tys)) theta