2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
4 \section[Inst]{The @Inst@ type: dictionaries or method instances}
7 #include "HsVersions.h"
10 Inst(..), -- Visible only to TcSimplify
12 InstOrigin(..), OverloadedLit(..),
13 LIE(..), emptyLIE, unitLIE, plusLIE, consLIE, zonkLIE, plusLIEs,
17 newDicts, newDictsAtLoc, newMethod, newMethodWithGivenTy, newOverloadedLit,
19 instType, tyVarsOfInst, lookupInst,
26 instBindingRequired, instCanBeGeneralised
32 import HsSyn ( HsLit(..), HsExpr(..), HsBinds,
33 InPat, OutPat, Stmt, Qual, Match,
34 ArithSeqInfo, PolyType, Fake )
35 import RnHsSyn ( RenamedArithSeqInfo(..), RenamedHsExpr(..) )
36 import TcHsSyn ( TcIdOcc(..), TcExpr(..), TcIdBndr(..),
37 mkHsTyApp, mkHsDictApp )
40 import TcEnv ( tcLookupGlobalValueByKey )
41 import TcType ( TcType(..), TcRhoType(..), TcMaybe, TcTyVarSet(..),
42 tcInstType, tcInstTcType, zonkTcType )
44 import Bag ( emptyBag, unitBag, unionBags, unionManyBags, listToBag, consBag )
45 import Class ( Class(..), GenClass, ClassInstEnv(..), classInstEnv )
46 import Id ( GenId, idType, mkInstId )
47 import MatchEnv ( lookupMEnv, insertMEnv )
48 import Name ( mkLocalName, getLocalName, Name )
50 import PprType ( GenClass, TyCon, GenType, GenTyVar )
51 import PprStyle ( PprStyle(..) )
53 import RnHsSyn ( RnName{-instance NamedThing-} )
54 import SpecEnv ( SpecEnv(..) )
55 import SrcLoc ( SrcLoc, mkUnknownSrcLoc )
56 import Type ( GenType, eqSimpleTy,
57 isTyVarTy, mkDictTy, splitForAllTy, splitSigmaTy,
58 splitRhoTy, matchTy, tyVarsOfType, tyVarsOfTypes )
59 import TyVar ( GenTyVar )
60 import TysPrim ( intPrimTy )
61 import TysWiredIn ( intDataCon )
62 import Unique ( Unique, showUnique,
63 fromRationalClassOpKey, fromIntClassOpKey, fromIntegerClassOpKey )
64 import Util ( panic, zipEqual, zipWithEqual, assoc, assertPanic )
68 %************************************************************************
70 \subsection[Inst-collections]{LIE: a collection of Insts}
72 %************************************************************************
75 type LIE s = Bag (Inst s)
78 unitLIE inst = unitBag inst
79 plusLIE lie1 lie2 = lie1 `unionBags` lie2
80 consLIE inst lie = inst `consBag` lie
81 plusLIEs lies = unionManyBags lies
83 zonkLIE :: LIE s -> NF_TcM s (LIE s)
84 zonkLIE lie = mapBagNF_Tc zonkInst lie
87 %************************************************************************
89 \subsection[Inst-types]{@Inst@ types}
91 %************************************************************************
93 An @Inst@ is either a dictionary, an instance of an overloaded
94 literal, or an instance of an overloaded value. We call the latter a
95 ``method'' even though it may not correspond to a class operation.
96 For example, we might have an instance of the @double@ function at
97 type Int, represented by
99 Method 34 doubleId [Int] origin
105 Class -- The type of the dict is (c t), where
106 (TcType s) -- c is the class and t the type;
113 (TcIdOcc s) -- The overloaded function
114 -- This function will be a global, local, or ClassOpId;
115 -- inside instance decls (only) it can also be an InstId!
116 -- The id needn't be completely polymorphic.
117 -- You'll probably find its name (for documentation purposes)
118 -- inside the InstOrigin
120 [TcType s] -- The types to which its polymorphic tyvars
121 -- should be instantiated.
122 -- These types must saturate the Id's foralls.
124 (TcRhoType s) -- Cached: (type-of-id applied to inst_tys)
125 -- If this type is (theta => tau) then the type of the Method
126 -- is tau, and the method can be built by saying
128 -- where dicts are constructed from theta
136 (TcType s) -- The type at which the literal is used
137 (InstOrigin s) -- Always a literal; but more convenient to carry this around
141 = OverloadedIntegral Integer -- The number
142 | OverloadedFractional Rational -- The number
144 getInstOrigin (Dict u clas ty origin loc) = origin
145 getInstOrigin (Method u clas ty rho origin loc) = origin
146 getInstOrigin (LitInst u lit ty origin loc) = origin
153 newDicts :: InstOrigin s
154 -> [(Class, TcType s)]
155 -> NF_TcM s (LIE s, [TcIdOcc s])
157 = tcGetSrcLoc `thenNF_Tc` \ loc ->
158 tcGetUniques (length theta) `thenNF_Tc` \ new_uniqs ->
160 mk_dict u (clas, ty) = Dict u clas ty orig loc
161 dicts = zipWithEqual mk_dict new_uniqs theta
163 returnNF_Tc (listToBag dicts, map instToId dicts)
165 newDictsAtLoc orig loc theta -- Local function, similar to newDicts,
166 -- but with slightly different interface
167 = tcGetUniques (length theta) `thenNF_Tc` \ new_uniqs ->
169 mk_dict u (clas, ty) = Dict u clas ty orig loc
170 dicts = zipWithEqual mk_dict new_uniqs theta
172 returnNF_Tc (dicts, map instToId dicts)
174 newMethod :: InstOrigin s
177 -> NF_TcM s (LIE s, TcIdOcc s)
178 newMethod orig id tys
179 = -- Get the Id type and instantiate it at the specified types
181 RealId id -> let (tyvars, rho) = splitForAllTy (idType id)
182 in tcInstType (tyvars `zipEqual` tys) rho
183 TcId id -> let (tyvars, rho) = splitForAllTy (idType id)
184 in tcInstTcType (tyvars `zipEqual` tys) rho
185 ) `thenNF_Tc` \ rho_ty ->
186 -- Our friend does the rest
187 newMethodWithGivenTy orig id tys rho_ty
190 newMethodWithGivenTy orig id tys rho_ty
191 = tcGetSrcLoc `thenNF_Tc` \ loc ->
192 tcGetUnique `thenNF_Tc` \ new_uniq ->
194 meth_inst = Method new_uniq id tys rho_ty orig loc
196 returnNF_Tc (unitLIE meth_inst, instToId meth_inst)
198 newMethodAtLoc :: InstOrigin s -> SrcLoc -> Id -> [TcType s] -> NF_TcM s (Inst s, TcIdOcc s)
199 newMethodAtLoc orig loc real_id tys -- Local function, similar to newMethod but with
200 -- slightly different interface
201 = -- Get the Id type and instantiate it at the specified types
203 (tyvars,rho) = splitForAllTy (idType real_id)
205 tcInstType (tyvars `zipEqual` tys) rho `thenNF_Tc` \ rho_ty ->
206 tcGetUnique `thenNF_Tc` \ new_uniq ->
208 meth_inst = Method new_uniq (RealId real_id) tys rho_ty orig loc
210 returnNF_Tc (meth_inst, instToId meth_inst)
212 newOverloadedLit :: InstOrigin s
215 -> NF_TcM s (LIE s, TcIdOcc s)
216 newOverloadedLit orig lit ty
217 = tcGetSrcLoc `thenNF_Tc` \ loc ->
218 tcGetUnique `thenNF_Tc` \ new_uniq ->
220 lit_inst = LitInst new_uniq lit ty orig loc
222 returnNF_Tc (unitLIE lit_inst, instToId lit_inst)
227 instToId :: Inst s -> TcIdOcc s
228 instToId (Dict u clas ty orig loc)
229 = TcId (mkInstId u (mkDictTy clas ty) (mkLocalName u SLIT("dict") loc))
230 instToId (Method u id tys rho_ty orig loc)
231 = TcId (mkInstId u tau_ty (mkLocalName u (getLocalName id) loc))
233 (_, tau_ty) = splitRhoTy rho_ty -- NB The method Id has just the tau type
234 instToId (LitInst u list ty orig loc)
235 = TcId (mkInstId u ty (mkLocalName u SLIT("lit") loc))
239 instType :: Inst s -> TcType s
240 instType (Dict _ clas ty _ _) = mkDictTy clas ty
241 instType (LitInst _ _ ty _ _) = ty
242 instType (Method _ id tys ty _ _) = ty
248 Zonking makes sure that the instance types are fully zonked,
249 but doesn't do the same for the Id in a Method. There's no
250 need, and it's a lot of extra work.
253 zonkInst :: Inst s -> NF_TcM s (Inst s)
254 zonkInst (Dict u clas ty orig loc)
255 = zonkTcType ty `thenNF_Tc` \ new_ty ->
256 returnNF_Tc (Dict u clas new_ty orig loc)
258 zonkInst (Method u id tys rho orig loc) -- Doesn't zonk the id!
259 = mapNF_Tc zonkTcType tys `thenNF_Tc` \ new_tys ->
260 zonkTcType rho `thenNF_Tc` \ new_rho ->
261 returnNF_Tc (Method u id new_tys new_rho orig loc)
263 zonkInst (LitInst u lit ty orig loc)
264 = zonkTcType ty `thenNF_Tc` \ new_ty ->
265 returnNF_Tc (LitInst u lit new_ty orig loc)
270 tyVarsOfInst :: Inst s -> TcTyVarSet s
271 tyVarsOfInst (Dict _ _ ty _ _) = tyVarsOfType ty
272 tyVarsOfInst (Method _ _ tys rho _ _) = tyVarsOfTypes tys
273 tyVarsOfInst (LitInst _ _ ty _ _) = tyVarsOfType ty
276 @matchesInst@ checks when two @Inst@s are instances of the same
277 thing at the same type, even if their uniques differ.
280 matchesInst :: Inst s -> Inst s -> Bool
282 matchesInst (Dict _ clas1 ty1 _ _) (Dict _ clas2 ty2 _ _)
283 = clas1 == clas2 && ty1 `eqSimpleTy` ty2
285 matchesInst (Method _ id1 tys1 _ _ _) (Method _ id2 tys2 _ _ _)
287 && and (zipWith eqSimpleTy tys1 tys2)
288 && length tys1 == length tys2
290 matchesInst (LitInst _ lit1 ty1 _ _) (LitInst _ lit2 ty2 _ _)
291 = lit1 `eq` lit2 && ty1 `eqSimpleTy` ty2
293 (OverloadedIntegral i1) `eq` (OverloadedIntegral i2) = i1 == i2
294 (OverloadedFractional f1) `eq` (OverloadedFractional f2) = f1 == f2
297 matchesInst other1 other2 = False
304 isDict :: Inst s -> Bool
305 isDict (Dict _ _ _ _ _) = True
308 isTyVarDict :: Inst s -> Bool
309 isTyVarDict (Dict _ _ ty _ _) = isTyVarTy ty
310 isTyVarDict other = False
313 Two predicates which deal with the case where class constraints don't
314 necessarily result in bindings. The first tells whether an @Inst@
315 must be witnessed by an actual binding; the second tells whether an
316 @Inst@ can be generalised over.
319 instBindingRequired :: Inst s -> Bool
320 instBindingRequired inst
321 = case getInstOrigin inst of
322 CCallOrigin _ _ -> False -- No binding required
323 LitLitOrigin _ -> False
324 OccurrenceOfCon _ -> False
327 instCanBeGeneralised :: Inst s -> Bool
328 instCanBeGeneralised inst
329 = case getInstOrigin inst of
330 CCallOrigin _ _ -> False -- Can't be generalised
331 LitLitOrigin _ -> False -- Can't be generalised
338 ToDo: improve these pretty-printing things. The ``origin'' is really only
339 relevant in error messages.
342 instance Outputable (Inst s) where
343 ppr sty (LitInst uniq lit ty orig loc)
344 = ppHang (ppSep [case lit of
345 OverloadedIntegral i -> ppInteger i
346 OverloadedFractional f -> ppRational f,
351 4 (show_origin sty orig)
353 ppr sty (Dict uniq clas ty orig loc)
354 = ppHang (ppSep [ppr sty clas,
359 4 (show_origin sty orig)
361 ppr sty (Method uniq id tys rho orig loc)
362 = ppHang (ppSep [ppr sty id,
367 4 (show_origin sty orig)
369 show_uniq PprDebug uniq = ppr PprDebug uniq
370 show_uniq sty uniq = ppNil
372 show_origin sty orig = ppBesides [ppLparen, pprOrigin sty orig, ppRparen]
375 Printing in error messages
378 noInstanceErr inst sty = ppHang (ppPStr SLIT("No instance for:")) 4 (ppr sty inst)
381 %************************************************************************
383 \subsection[InstEnv-types]{Type declarations}
385 %************************************************************************
388 type InstanceMapper = Class -> (ClassInstEnv, ClassOp -> SpecEnv)
391 A @ClassInstEnv@ lives inside a class, and identifies all the instances
392 of that class. The @Id@ inside a ClassInstEnv mapping is the dfun for
395 There is an important consistency constraint between the @MatchEnv@s
396 in and the dfun @Id@s inside them: the free type variables of the
397 @Type@ key in the @MatchEnv@ must be a subset of the universally-quantified
398 type variables of the dfun. Thus, the @ClassInstEnv@ for @Eq@ might
399 contain the following entry:
401 [a] ===> dfun_Eq_List :: forall a. Eq a => Eq [a]
403 The "a" in the pattern must be one of the forall'd variables in
409 (TcIdOcc s, TcExpr s)) -- The new binding
413 lookupInst dict@(Dict _ clas ty orig loc)
414 = case lookupMEnv matchTy (get_inst_env clas orig) ty of
415 Nothing -> failTc (noInstanceErr dict)
419 (tyvars, rho) = splitForAllTy (idType dfun_id)
420 ty_args = map (assoc "lookupInst" tenv) tyvars
421 -- tenv should bind all the tyvars
423 tcInstType tenv rho `thenNF_Tc` \ dfun_rho ->
425 (theta, tau) = splitRhoTy dfun_rho
427 newDictsAtLoc orig loc theta `thenNF_Tc` \ (dicts, dict_ids) ->
429 rhs = mkHsDictApp (mkHsTyApp (HsVar (RealId dfun_id)) ty_args) dict_ids
431 returnTc (dicts, (instToId dict, rhs))
436 lookupInst inst@(Method _ id tys rho orig loc)
437 = newDictsAtLoc orig loc theta `thenNF_Tc` \ (dicts, dict_ids) ->
438 returnTc (dicts, (instToId inst, mkHsDictApp (mkHsTyApp (HsVar id) tys) dict_ids))
440 (theta,_) = splitRhoTy rho
444 lookupInst inst@(LitInst u (OverloadedIntegral i) ty orig loc)
445 | i >= toInteger minInt && i <= toInteger maxInt
446 = -- It's overloaded but small enough to fit into an Int
447 tcLookupGlobalValueByKey fromIntClassOpKey `thenNF_Tc` \ from_int ->
448 newMethodAtLoc orig loc from_int [ty] `thenNF_Tc` \ (method_inst, method_id) ->
449 returnTc ([method_inst], (instToId inst, HsApp (HsVar method_id) int_lit))
452 = -- Alas, it is overloaded and a big literal!
453 tcLookupGlobalValueByKey fromIntegerClassOpKey `thenNF_Tc` \ from_integer ->
454 newMethodAtLoc orig loc from_integer [ty] `thenNF_Tc` \ (method_inst, method_id) ->
455 returnTc ([method_inst], (instToId inst, HsApp (HsVar method_id) (HsLitOut (HsInt i) ty)))
457 intprim_lit = HsLitOut (HsIntPrim i) intPrimTy
458 int_lit = HsApp (HsVar (RealId intDataCon)) intprim_lit
460 lookupInst inst@(LitInst u (OverloadedFractional f) ty orig loc)
461 = tcLookupGlobalValueByKey fromRationalClassOpKey `thenNF_Tc` \ from_rational ->
462 newMethodAtLoc orig loc from_rational [ty] `thenNF_Tc` \ (method_inst, method_id) ->
463 returnTc ([method_inst], (instToId inst, HsApp (HsVar method_id) (HsLitOut (HsFrac f) ty)))
466 There is a second, simpler interface, when you want an instance of a
467 class at a given nullary type constructor. It just returns the
468 appropriate dictionary if it exists. It is used only when resolving
469 ambiguous dictionaries.
472 lookupClassInstAtSimpleType :: Class -> Type -> Maybe Id
474 lookupClassInstAtSimpleType clas ty
475 = case (lookupMEnv matchTy (classInstEnv clas) ty) of
477 Just (dfun,_) -> ASSERT( null tyvars && null theta )
480 (tyvars, theta, _) = splitSigmaTy (idType dfun)
484 @mkInstSpecEnv@ is used to construct the @SpecEnv@ for a dfun.
485 It does it by filtering the class's @InstEnv@. All pretty shady stuff.
488 mkInstSpecEnv clas inst_ty inst_tvs inst_theta = panic "mkInstSpecEnv"
492 mkInstSpecEnv :: Class -- class
493 -> Type -- instance type
494 -> [TyVarTemplate] -- instance tyvars
495 -> ThetaType -- superclasses dicts
496 -> SpecEnv -- specenv for dfun of instance
498 mkInstSpecEnv clas inst_ty inst_tvs inst_theta
499 = mkSpecEnv (catMaybes (map maybe_spec_info matches))
501 matches = matchMEnv matchTy (classInstEnv clas) inst_ty
503 maybe_spec_info (_, match_info, MkInstTemplate dfun _ [])
504 = Just (SpecInfo (map (assocMaybe match_info) inst_tvs) (length inst_theta) dfun)
505 maybe_spec_info (_, match_info, _)
512 :: ClassInstEnv -- Incoming envt
513 -> Type -- The instance type: inst_ty
514 -> Id -- Dict fun id to apply. Free tyvars of inst_ty must
515 -- be the same as the forall'd tyvars of the dfun id.
517 ClassInstEnv -- Success
518 (Type, Id) -- Offending overlap
520 addClassInst inst_env inst_ty dfun_id = insertMEnv matchTy inst_env inst_ty dfun_id
525 %************************************************************************
527 \subsection[Inst-origin]{The @InstOrigin@ type}
529 %************************************************************************
531 The @InstOrigin@ type gives information about where a dictionary came from.
532 This is important for decent error message reporting because dictionaries
533 don't appear in the original source code. Doubtless this type will evolve...
537 = OccurrenceOf (TcIdOcc s) -- Occurrence of an overloaded identifier
538 | OccurrenceOfCon Id -- Occurrence of a data constructor
542 | DataDeclOrigin -- Typechecking a data declaration
544 | InstanceDeclOrigin -- Typechecking an instance decl
546 | LiteralOrigin HsLit -- Occurrence of a literal
548 | ArithSeqOrigin RenamedArithSeqInfo -- [x..], [x..y] etc
550 | SignatureOrigin -- A dict created from a type signature
552 | DoOrigin -- The monad for a do expression
554 | ClassDeclOrigin -- Manufactured during a class decl
556 | DerivingOrigin InstanceMapper
560 -- During "deriving" operations we have an ever changing
561 -- mapping of classes to instances, so we record it inside the
562 -- origin information. This is a bit of a hack, but it works
563 -- fine. (Simon is to blame [WDP].)
565 | InstanceSpecOrigin InstanceMapper
566 Class -- in a SPECIALIZE instance pragma
569 -- When specialising instances the instance info attached to
570 -- each class is not yet ready, so we record it inside the
571 -- origin information. This is a bit of a hack, but it works
572 -- fine. (Patrick is to blame [WDP].)
574 | DefaultDeclOrigin -- Related to a `default' declaration
576 | ValSpecOrigin Name -- in a SPECIALIZE pragma for a value
578 -- Argument or result of a ccall
579 -- Dictionaries with this origin aren't actually mentioned in the
580 -- translated term, and so need not be bound. Nor should they
581 -- be abstracted over.
583 | CCallOrigin String -- CCall label
584 (Maybe RenamedHsExpr) -- Nothing if it's the result
585 -- Just arg, for an argument
587 | LitLitOrigin String -- the litlit
589 | UnknownOrigin -- Help! I give up...
593 -- During deriving and instance specialisation operations
594 -- we can't get the instances of the class from inside the
595 -- class, because the latter ain't ready yet. Instead we
596 -- find a mapping from classes to envts inside the dict origin.
598 get_inst_env :: Class -> InstOrigin s -> ClassInstEnv
599 get_inst_env clas (DerivingOrigin inst_mapper _ _)
600 = fst (inst_mapper clas)
601 get_inst_env clas (InstanceSpecOrigin inst_mapper _ _)
602 = fst (inst_mapper clas)
603 get_inst_env clas other_orig = classInstEnv clas
606 pprOrigin :: PprStyle -> InstOrigin s -> Pretty
608 pprOrigin sty (OccurrenceOf id)
609 = ppBesides [ppPStr SLIT("at a use of an overloaded identifier: `"),
610 ppr sty id, ppChar '\'']
611 pprOrigin sty (OccurrenceOfCon id)
612 = ppBesides [ppPStr SLIT("at a use of an overloaded constructor: `"),
613 ppr sty id, ppChar '\'']
614 pprOrigin sty (InstanceDeclOrigin)
615 = ppStr "in an instance declaration"
616 pprOrigin sty (LiteralOrigin lit)
617 = ppCat [ppStr "at an overloaded literal:", ppr sty lit]
618 pprOrigin sty (ArithSeqOrigin seq)
619 = ppCat [ppStr "at an arithmetic sequence:", ppr sty seq]
620 pprOrigin sty (SignatureOrigin)
621 = ppStr "in a type signature"
622 pprOrigin sty (DoOrigin)
623 = ppStr "in a do statement"
624 pprOrigin sty (ClassDeclOrigin)
625 = ppStr "in a class declaration"
626 pprOrigin sty (DerivingOrigin _ clas tycon)
627 = ppBesides [ppStr "in a `deriving' clause; class `",
629 ppStr "'; offending type `",
632 pprOrigin sty (InstanceSpecOrigin _ clas ty)
633 = ppBesides [ppStr "in a SPECIALIZE instance pragma; class \"",
634 ppr sty clas, ppStr "\" type: ", ppr sty ty]
635 pprOrigin sty (DefaultDeclOrigin)
636 = ppStr "in a `default' declaration"
637 pprOrigin sty (ValSpecOrigin name)
638 = ppBesides [ppStr "in a SPECIALIZE user-pragma for `",
639 ppr sty name, ppStr "'"]
640 pprOrigin sty (CCallOrigin clabel Nothing{-ccall result-})
641 = ppBesides [ppStr "in the result of the _ccall_ to `",
642 ppStr clabel, ppStr "'"]
643 pprOrigin sty (CCallOrigin clabel (Just arg_expr))
644 = ppBesides [ppStr "in an argument in the _ccall_ to `",
645 ppStr clabel, ppStr "', namely: ", ppr sty arg_expr]
646 pprOrigin sty (LitLitOrigin s)
647 = ppBesides [ppStr "in this ``literal-literal'': ", ppStr s]
648 pprOrigin sty UnknownOrigin
649 = ppStr "in... oops -- I don't know where the overloading came from!"