2 #include "HsVersions.h"
5 GenType(..), SYN_IE(Type), SYN_IE(TauType),
7 getTyVar, getTyVar_maybe, isTyVarTy,
8 mkAppTy, mkAppTys, splitAppTy,
10 splitFunTy, splitFunTyExpandingDicts, splitFunTyExpandingDictsAndPeeking,
11 getFunTy_maybe, getFunTyExpandingDicts_maybe,
12 mkTyConTy, getTyCon_maybe, applyTyCon,
14 mkForAllTy, mkForAllTys, getForAllTy_maybe, getForAllTyExpandingDicts_maybe, splitForAllTy,
15 mkForAllUsageTy, getForAllUsageTy,
18 expandTy, -- only let out for debugging (ToDo: rm?)
20 isPrimType, isUnboxedType, typePrimRep,
22 SYN_IE(RhoType), SYN_IE(SigmaType), SYN_IE(ThetaType),
24 mkRhoTy, splitRhoTy, mkTheta, isDictTy,
25 mkSigmaTy, splitSigmaTy,
27 maybeAppTyCon, getAppTyCon,
28 maybeAppDataTyCon, getAppDataTyCon, getAppSpecDataTyCon,
29 maybeAppDataTyConExpandingDicts, maybeAppSpecDataTyConExpandingDicts,
30 getAppDataTyConExpandingDicts, getAppSpecDataTyConExpandingDicts,
33 matchTy, matchTys, eqTy, eqSimpleTy, eqSimpleTheta,
35 instantiateTy, instantiateTauTy, instantiateUsage,
40 tyVarsOfType, tyVarsOfTypes, namesOfType, typeKind
44 --IMPORT_DELOOPER(IdLoop) -- for paranoia checking
45 IMPORT_DELOOPER(TyLoop)
46 --IMPORT_DELOOPER(PrelLoop) -- for paranoia checking
49 import Class ( classSig, classOpLocalType, GenClass{-instances-} )
50 import Kind ( mkBoxedTypeKind, resultKind, notArrowKind, Kind )
51 import TyCon ( mkFunTyCon, isFunTyCon,
52 isPrimTyCon, isDataTyCon, isSynTyCon, maybeNewTyCon, isNewTyCon,
53 tyConKind, tyConDataCons, getSynTyConDefn, TyCon )
54 import TyVar ( tyVarKind, GenTyVar{-instances-}, SYN_IE(GenTyVarSet),
55 emptyTyVarSet, unionTyVarSets, minusTyVarSet,
56 unitTyVarSet, nullTyVarEnv, lookupTyVarEnv, delFromTyVarEnv,
57 addOneToTyVarEnv, SYN_IE(TyVarEnv), SYN_IE(TyVar) )
58 import Usage ( usageOmega, GenUsage, SYN_IE(Usage), SYN_IE(UVar), SYN_IE(UVarEnv),
59 nullUVarEnv, addOneToUVarEnv, lookupUVarEnv, eqUVar,
62 import Name ( NamedThing(..),
63 NameSet(..), unionNameSets, emptyNameSet, unitNameSet, minusNameSet
67 import Maybes ( maybeToBool, assocMaybe )
68 import PrimRep ( PrimRep(..) )
69 import Unique -- quite a few *Keys
70 import Util ( thenCmp, zipEqual, assoc,
71 panic, panic#, assertPanic, pprPanic,
80 -- PprType --(pprType )
82 -- UniqFM (ufmToList )
92 type Type = GenType TyVar UVar -- Used after typechecker
94 data GenType tyvar uvar -- Parameterised over type and usage variables
101 | TyConTy -- Constants of a specified kind
102 TyCon -- Must *not* be a SynTyCon
103 (GenUsage uvar) -- Usage gives uvar of the full application,
104 -- iff the full application is of kind Type
105 -- c.f. the Usage field in TyVars
107 | SynTy -- Synonyms must be saturated, and contain their expansion
108 TyCon -- Must be a SynTyCon
110 (GenType tyvar uvar) -- Expansion!
114 (GenType tyvar uvar) -- TypeKind
117 uvar -- Quantify over this
118 [uvar] -- Bounds; the quantified var must be
119 -- less than or equal to all these
122 -- Two special cases that save a *lot* of administrative
125 | FunTy -- BoxedTypeKind
126 (GenType tyvar uvar) -- Both args are of TypeKind
132 (GenType tyvar uvar) -- Arg has kind TypeKind
139 type ThetaType = [(Class, Type)]
140 type SigmaType = Type
146 Removes just the top level of any abbreviations.
149 expandTy :: Type -> Type -- Restricted to Type due to Dict expansion
151 expandTy (FunTy t1 t2 u) = AppTy (AppTy (TyConTy mkFunTyCon u) t1) t2
152 expandTy (SynTy _ _ t) = expandTy t
153 expandTy (DictTy clas ty u)
154 = case all_arg_tys of
156 [] -> voidTy -- Empty dictionary represented by Void
158 [arg_ty] -> expandTy arg_ty -- just the <whatever> itself
160 -- The extra expandTy is to make sure that
161 -- the result isn't still a dict, which it might be
162 -- if the original guy was a dict with one superdict and
165 other -> ASSERT(not (null all_arg_tys))
166 foldl AppTy (TyConTy (tupleTyCon (length all_arg_tys)) u) all_arg_tys
169 -- Note: length of all_arg_tys can be 0 if the class is
170 -- CCallable, CReturnable (and anything else
171 -- *really weird* that the user writes).
173 (tyvar, super_classes, ops) = classSig clas
174 super_dict_tys = map mk_super_ty super_classes
175 class_op_tys = map mk_op_ty ops
176 all_arg_tys = super_dict_tys ++ class_op_tys
177 mk_super_ty sc = DictTy sc ty usageOmega
178 mk_op_ty op = instantiateTy [(tyvar,ty)] (classOpLocalType op)
183 Simple construction and analysis functions
184 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
186 mkTyVarTy :: t -> GenType t u
187 mkTyVarTys :: [t] -> [GenType t y]
189 mkTyVarTys = map mkTyVarTy -- a common use of mkTyVarTy
191 getTyVar :: String -> GenType t u -> t
192 getTyVar msg (TyVarTy tv) = tv
193 getTyVar msg (SynTy _ _ t) = getTyVar msg t
194 getTyVar msg other = panic ("getTyVar: " ++ msg)
196 getTyVar_maybe :: GenType t u -> Maybe t
197 getTyVar_maybe (TyVarTy tv) = Just tv
198 getTyVar_maybe (SynTy _ _ t) = getTyVar_maybe t
199 getTyVar_maybe other = Nothing
201 isTyVarTy :: GenType t u -> Bool
202 isTyVarTy (TyVarTy tv) = True
203 isTyVarTy (SynTy _ _ t) = isTyVarTy t
204 isTyVarTy other = False
210 mkAppTys :: GenType t u -> [GenType t u] -> GenType t u
211 mkAppTys t ts = foldl AppTy t ts
213 splitAppTy :: GenType t u -> (GenType t u, [GenType t u])
214 splitAppTy t = go t []
216 go (AppTy t arg) ts = go t (arg:ts)
217 go (FunTy fun arg u) ts = (TyConTy mkFunTyCon u, fun:arg:ts)
218 go (SynTy _ _ t) ts = go t ts
223 -- NB mkFunTy, mkFunTys puts in Omega usages, for now at least
224 mkFunTy arg res = FunTy arg res usageOmega
226 mkFunTys :: [GenType t u] -> GenType t u -> GenType t u
227 mkFunTys ts t = foldr (\ f a -> FunTy f a usageOmega) t ts
229 -- getFunTy_maybe and splitFunTy *must* have the general type given, which
230 -- means they *can't* do the DictTy jiggery-pokery that
231 -- *is* sometimes required. Hence we also have the ExpandingDicts variants
232 -- The relationship between these
233 -- two functions is like that between eqTy and eqSimpleTy.
234 -- ToDo: NUKE when we do dicts via newtype
236 getFunTy_maybe :: GenType t u -> Maybe (GenType t u, GenType t u)
237 getFunTy_maybe (FunTy arg result _) = Just (arg,result)
238 getFunTy_maybe (AppTy (AppTy (TyConTy tycon _) arg) res)
239 | isFunTyCon tycon = Just (arg, res)
240 getFunTy_maybe (SynTy _ _ t) = getFunTy_maybe t
241 getFunTy_maybe other = Nothing
243 getFunTyExpandingDicts_maybe :: Bool -- True <=> peek inside newtype applicatons
245 -> Maybe (Type, Type)
247 getFunTyExpandingDicts_maybe peek (FunTy arg result _) = Just (arg,result)
248 getFunTyExpandingDicts_maybe peek
249 (AppTy (AppTy (TyConTy tycon _) arg) res) | isFunTyCon tycon = Just (arg, res)
250 getFunTyExpandingDicts_maybe peek (SynTy _ _ t) = getFunTyExpandingDicts_maybe peek t
251 getFunTyExpandingDicts_maybe peek ty@(DictTy _ _ _) = getFunTyExpandingDicts_maybe peek (expandTy ty)
253 getFunTyExpandingDicts_maybe True (ForAllTy _ ty) = getFunTyExpandingDicts_maybe True ty
254 -- Ignore for-alls when peeking. See note with defn of getFunTyExpandingDictsAndPeeking
256 getFunTyExpandingDicts_maybe peek other
257 | not peek = Nothing -- that was easy
259 = case (maybeAppTyCon other) of
262 | not (isNewTyCon tc) -> Nothing
265 [newtype_con] = tyConDataCons tc -- there must be exactly one...
266 [inside_ty] = dataConArgTys newtype_con arg_tys
268 getFunTyExpandingDicts_maybe peek inside_ty
270 splitFunTy :: GenType t u -> ([GenType t u], GenType t u)
271 splitFunTyExpandingDicts :: Type -> ([Type], Type)
272 splitFunTyExpandingDictsAndPeeking :: Type -> ([Type], Type)
274 splitFunTy t = split_fun_ty getFunTy_maybe t
275 splitFunTyExpandingDicts t = split_fun_ty (getFunTyExpandingDicts_maybe False) t
276 splitFunTyExpandingDictsAndPeeking t = split_fun_ty (getFunTyExpandingDicts_maybe True) t
277 -- This "peeking" stuff is used only by the code generator.
278 -- It's interested in the representation type of things, ignoring:
281 -- expanding dictionary reps
282 -- synonyms, of course
284 split_fun_ty get t = go t []
286 go t ts = case (get t) of
287 Just (arg,res) -> go res (arg:ts)
288 Nothing -> (reverse ts, t)
292 -- NB applyTyCon puts in usageOmega, for now at least
294 = ASSERT(not (isSynTyCon tycon))
295 TyConTy tycon usageOmega
297 applyTyCon :: TyCon -> [GenType t u] -> GenType t u
299 = ASSERT (not (isSynTyCon tycon))
300 --(if (not (isSynTyCon tycon)) then \x->x else pprTrace "applyTyCon:" (pprTyCon PprDebug tycon)) $
301 foldl AppTy (TyConTy tycon usageOmega) tys
303 getTyCon_maybe :: GenType t u -> Maybe TyCon
304 --getTyConExpandingDicts_maybe :: Type -> Maybe TyCon
306 getTyCon_maybe (TyConTy tycon _) = Just tycon
307 getTyCon_maybe (SynTy _ _ t) = getTyCon_maybe t
308 getTyCon_maybe other_ty = Nothing
310 --getTyConExpandingDicts_maybe (TyConTy tycon _) = Just tycon
311 --getTyConExpandingDicts_maybe (SynTy _ _ t) = getTyConExpandingDicts_maybe t
312 --getTyConExpandingDicts_maybe ty@(DictTy _ _ _) = getTyConExpandingDicts_maybe (expandTy ty)
313 --getTyConExpandingDicts_maybe other_ty = Nothing
317 mkSynTy syn_tycon tys
318 = ASSERT(isSynTyCon syn_tycon)
319 SynTy syn_tycon tys (instantiateTauTy (zipEqual "mkSynTy" tyvars tys) body)
321 (tyvars, body) = getSynTyConDefn syn_tycon
327 isTauTy :: GenType t u -> Bool
328 isTauTy (TyVarTy v) = True
329 isTauTy (TyConTy _ _) = True
330 isTauTy (AppTy a b) = isTauTy a && isTauTy b
331 isTauTy (FunTy a b _) = isTauTy a && isTauTy b
332 isTauTy (SynTy _ _ ty) = isTauTy ty
333 isTauTy other = False
338 NB mkRhoTy and mkDictTy put in usageOmega, for now at least
341 mkDictTy :: Class -> GenType t u -> GenType t u
342 mkDictTy clas ty = DictTy clas ty usageOmega
344 mkRhoTy :: [(Class, GenType t u)] -> GenType t u -> GenType t u
346 foldr (\(c,t) r -> FunTy (DictTy c t usageOmega) r usageOmega) ty theta
348 splitRhoTy :: GenType t u -> ([(Class,GenType t u)], GenType t u)
352 go (FunTy (DictTy c t _) r _) ts = go r ((c,t):ts)
353 go (AppTy (AppTy (TyConTy tycon _) (DictTy c t _)) r) ts
356 go (SynTy _ _ t) ts = go t ts
357 go t ts = (reverse ts, t)
360 mkTheta :: [Type] -> ThetaType
361 -- recover a ThetaType from the types of some dictionaries
365 cvt (DictTy clas ty _) = (clas, ty)
366 cvt other = panic "Type.mkTheta" -- pprPanic "mkTheta:" (pprType PprDebug other)
368 isDictTy (DictTy _ _ _) = True
369 isDictTy (SynTy _ _ t) = isDictTy t
377 mkForAllTy = ForAllTy
379 mkForAllTys :: [t] -> GenType t u -> GenType t u
380 mkForAllTys tyvars ty = foldr ForAllTy ty tyvars
382 getForAllTy_maybe :: GenType t u -> Maybe (t,GenType t u)
383 getForAllTy_maybe (SynTy _ _ t) = getForAllTy_maybe t
384 getForAllTy_maybe (ForAllTy tyvar t) = Just(tyvar,t)
385 getForAllTy_maybe _ = Nothing
387 getForAllTyExpandingDicts_maybe :: Type -> Maybe (TyVar, Type)
388 getForAllTyExpandingDicts_maybe (SynTy _ _ t) = getForAllTyExpandingDicts_maybe t
389 getForAllTyExpandingDicts_maybe (ForAllTy tyvar t) = Just(tyvar,t)
390 getForAllTyExpandingDicts_maybe ty@(DictTy _ _ _) = getForAllTyExpandingDicts_maybe (expandTy ty)
391 getForAllTyExpandingDicts_maybe _ = Nothing
393 splitForAllTy :: GenType t u-> ([t], GenType t u)
394 splitForAllTy t = go t []
396 go (ForAllTy tv t) tvs = go t (tv:tvs)
397 go (SynTy _ _ t) tvs = go t tvs
398 go t tvs = (reverse tvs, t)
402 mkForAllUsageTy :: u -> [u] -> GenType t u -> GenType t u
403 mkForAllUsageTy = ForAllUsageTy
405 getForAllUsageTy :: GenType t u -> Maybe (u,[u],GenType t u)
406 getForAllUsageTy (ForAllUsageTy uvar bounds t) = Just(uvar,bounds,t)
407 getForAllUsageTy (SynTy _ _ t) = getForAllUsageTy t
408 getForAllUsageTy _ = Nothing
411 Applied tycons (includes FunTyCons)
412 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
415 :: GenType tyvar uvar
416 -> Maybe (TyCon, -- the type constructor
417 [GenType tyvar uvar]) -- types to which it is applied
420 = case (getTyCon_maybe app_ty) of
422 Just tycon -> Just (tycon, arg_tys)
424 (app_ty, arg_tys) = splitAppTy ty
428 :: GenType tyvar uvar
429 -> (TyCon, -- the type constructor
430 [GenType tyvar uvar]) -- types to which it is applied
433 = case maybeAppTyCon ty of
436 Nothing -> panic "Type.getAppTyCon" -- (ppr PprShowAll ty)
440 Applied data tycons (give back constrs)
441 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
444 :: GenType (GenTyVar any) uvar
445 -> Maybe (TyCon, -- the type constructor
446 [GenType (GenTyVar any) uvar], -- types to which it is applied
447 [Id]) -- its family of data-constructors
448 maybeAppDataTyConExpandingDicts, maybeAppSpecDataTyConExpandingDicts
449 :: Type -> Maybe (TyCon, [Type], [Id])
451 maybeAppDataTyCon ty = maybe_app_data_tycon (\x->x) ty
452 maybeAppDataTyConExpandingDicts ty = maybe_app_data_tycon expandTy ty
453 maybeAppSpecDataTyConExpandingDicts ty = maybe_app_data_tycon expandTy ty
456 maybe_app_data_tycon expand ty
458 expanded_ty = expand ty
459 (app_ty, arg_tys) = splitAppTy expanded_ty
461 case (getTyCon_maybe app_ty) of
462 Just tycon | --pprTrace "maybe_app:" (ppCat [ppr PprDebug (isDataTyCon tycon), ppr PprDebug (notArrowKind (typeKind expanded_ty))]) $
464 notArrowKind (typeKind expanded_ty)
465 -- Must be saturated for ty to be a data type
466 -> Just (tycon, arg_tys, tyConDataCons tycon)
470 getAppDataTyCon, getAppSpecDataTyCon
471 :: GenType (GenTyVar any) uvar
472 -> (TyCon, -- the type constructor
473 [GenType (GenTyVar any) uvar], -- types to which it is applied
474 [Id]) -- its family of data-constructors
475 getAppDataTyConExpandingDicts, getAppSpecDataTyConExpandingDicts
476 :: Type -> (TyCon, [Type], [Id])
478 getAppDataTyCon ty = get_app_data_tycon maybeAppDataTyCon ty
479 getAppDataTyConExpandingDicts ty = --pprTrace "getAppDataTyConEx...:" (pprType PprDebug ty) $
480 get_app_data_tycon maybeAppDataTyConExpandingDicts ty
482 -- these should work like the UniTyFuns.getUniDataSpecTyCon* things of old (ToDo)
483 getAppSpecDataTyCon = getAppDataTyCon
484 getAppSpecDataTyConExpandingDicts = getAppDataTyConExpandingDicts
486 get_app_data_tycon maybe ty
490 Nothing -> panic "Type.getAppDataTyCon"-- (pprGenType PprShowAll ty)
494 maybeBoxedPrimType :: Type -> Maybe (Id, Type)
496 maybeBoxedPrimType ty
497 = case (maybeAppDataTyCon ty) of -- Data type,
498 Just (tycon, tys_applied, [data_con]) -- with exactly one constructor
499 -> case (dataConArgTys data_con tys_applied) of
500 [data_con_arg_ty] -- Applied to exactly one type,
501 | isPrimType data_con_arg_ty -- which is primitive
502 -> Just (data_con, data_con_arg_ty)
503 other_cases -> Nothing
504 other_cases -> Nothing
508 splitSigmaTy :: GenType t u -> ([t], [(Class,GenType t u)], GenType t u)
512 (tyvars,rho) = splitForAllTy ty
513 (theta,tau) = splitRhoTy rho
515 mkSigmaTy tyvars theta tau = mkForAllTys tyvars (mkRhoTy theta tau)
519 Finding the kind of a type
520 ~~~~~~~~~~~~~~~~~~~~~~~~~~
522 typeKind :: GenType (GenTyVar any) u -> Kind
524 typeKind (TyVarTy tyvar) = tyVarKind tyvar
525 typeKind (TyConTy tycon usage) = tyConKind tycon
526 typeKind (SynTy _ _ ty) = typeKind ty
527 typeKind (FunTy fun arg _) = mkBoxedTypeKind
528 typeKind (DictTy clas arg _) = mkBoxedTypeKind
529 typeKind (AppTy fun arg) = resultKind (typeKind fun)
530 typeKind (ForAllTy _ _) = mkBoxedTypeKind
531 typeKind (ForAllUsageTy _ _ _) = mkBoxedTypeKind
535 Free variables of a type
536 ~~~~~~~~~~~~~~~~~~~~~~~~
538 tyVarsOfType :: GenType (GenTyVar flexi) uvar -> GenTyVarSet flexi
540 tyVarsOfType (TyVarTy tv) = unitTyVarSet tv
541 tyVarsOfType (TyConTy tycon usage) = emptyTyVarSet
542 tyVarsOfType (SynTy _ tys ty) = tyVarsOfTypes tys
543 tyVarsOfType (FunTy arg res _) = tyVarsOfType arg `unionTyVarSets` tyVarsOfType res
544 tyVarsOfType (AppTy fun arg) = tyVarsOfType fun `unionTyVarSets` tyVarsOfType arg
545 tyVarsOfType (DictTy clas ty _) = tyVarsOfType ty
546 tyVarsOfType (ForAllTy tyvar ty) = tyVarsOfType ty `minusTyVarSet` unitTyVarSet tyvar
547 tyVarsOfType (ForAllUsageTy _ _ ty) = tyVarsOfType ty
549 tyVarsOfTypes :: [GenType (GenTyVar flexi) uvar] -> GenTyVarSet flexi
550 tyVarsOfTypes tys = foldr (unionTyVarSets.tyVarsOfType) emptyTyVarSet tys
552 -- Find the free names of a type, including the type constructors and classes it mentions
553 namesOfType :: GenType (GenTyVar flexi) uvar -> NameSet
554 namesOfType (TyVarTy tv) = unitNameSet (getName tv)
555 namesOfType (TyConTy tycon usage) = unitNameSet (getName tycon)
556 namesOfType (SynTy tycon tys ty) = unitNameSet (getName tycon) `unionNameSets`
558 namesOfType (FunTy arg res _) = namesOfType arg `unionNameSets` namesOfType res
559 namesOfType (AppTy fun arg) = namesOfType fun `unionNameSets` namesOfType arg
560 namesOfType (DictTy clas ty _) = unitNameSet (getName clas) `unionNameSets`
562 namesOfType (ForAllTy tyvar ty) = namesOfType ty `minusNameSet` unitNameSet (getName tyvar)
563 namesOfType (ForAllUsageTy _ _ ty) = panic "forall usage"
570 -- applyTy :: GenType (GenTyVar flexi) uvar
571 -- -> GenType (GenTyVar flexi) uvar
572 -- -> GenType (GenTyVar flexi) uvar
574 applyTy :: Type -> Type -> Type
576 applyTy (SynTy _ _ fun) arg = applyTy fun arg
577 applyTy (ForAllTy tv ty) arg = instantiateTy [(tv,arg)] ty
578 applyTy ty@(DictTy _ _ _) arg = applyTy (expandTy ty) arg
579 applyTy other arg = panic "applyTy"
583 instantiateTy :: [(GenTyVar flexi, GenType (GenTyVar flexi) uvar)]
584 -> GenType (GenTyVar flexi) uvar
585 -> GenType (GenTyVar flexi) uvar
587 instantiateTauTy :: Eq tv =>
588 [(tv, GenType tv' u)]
592 applyTypeEnvToTy :: TyVarEnv Type -> SigmaType -> SigmaType
594 -- instantiateTauTy works only (a) on types with no ForAlls,
595 -- and when (b) all the type variables are being instantiated
596 -- In return it is more polymorphic than instantiateTy
598 instant_help ty lookup_tv deflt_tv choose_tycon
599 if_usage if_forall bound_forall_tv_BAD deflt_forall_tv
602 go (TyVarTy tv) = case (lookup_tv tv) of
603 Nothing -> deflt_tv tv
605 go ty@(TyConTy tycon usage) = choose_tycon ty tycon usage
606 go (SynTy tycon tys ty) = SynTy tycon (map go tys) (go ty)
607 go (FunTy arg res usage) = FunTy (go arg) (go res) usage
608 go (AppTy fun arg) = AppTy (go fun) (go arg)
609 go (DictTy clas ty usage) = DictTy clas (go ty) usage
610 go (ForAllUsageTy uvar bds ty) = if_usage $
611 ForAllUsageTy uvar bds (go ty)
612 go (ForAllTy tv ty) = if_forall $
613 (if (bound_forall_tv_BAD && maybeToBool (lookup_tv tv)) then
614 trace "instantiateTy: unexpected forall hit"
616 \x->x) ForAllTy (deflt_forall_tv tv) (go ty)
618 instantiateTy tenv ty
619 = instant_help ty lookup_tv deflt_tv choose_tycon
620 if_usage if_forall bound_forall_tv_BAD deflt_forall_tv
622 lookup_tv tv = case [ty | (tv',ty) <- tenv, tv == tv'] of
625 _ -> panic "instantiateTy:lookup_tv"
627 deflt_tv tv = TyVarTy tv
628 choose_tycon ty _ _ = ty
631 bound_forall_tv_BAD = True
632 deflt_forall_tv tv = tv
634 instantiateTauTy tenv ty
635 = instant_help ty lookup_tv deflt_tv choose_tycon
636 if_usage if_forall bound_forall_tv_BAD deflt_forall_tv
638 lookup_tv tv = case [ty | (tv',ty) <- tenv, tv == tv'] of
641 _ -> panic "instantiateTauTy:lookup_tv"
643 deflt_tv tv = panic "instantiateTauTy"
644 choose_tycon _ tycon usage = TyConTy tycon usage
645 if_usage ty = panic "instantiateTauTy:ForAllUsageTy"
646 if_forall ty = panic "instantiateTauTy:ForAllTy"
647 bound_forall_tv_BAD = panic "instantiateTauTy:bound_forall_tv"
648 deflt_forall_tv tv = panic "instantiateTauTy:deflt_forall_tv"
651 -- applyTypeEnv applies a type environment to a type.
652 -- It can handle shadowing; for example:
653 -- f = /\ t1 t2 -> \ d ->
654 -- letrec f' = /\ t1 -> \x -> ...(f' t1 x')...
656 -- Here, when we clone t1 to t1', say, we'll come across shadowing
657 -- when applying the clone environment to the type of f'.
659 -- As a sanity check, we should also check that name capture
660 -- doesn't occur, but that means keeping track of the free variables of the
661 -- range of the TyVarEnv, which I don't do just yet.
663 -- We don't use instant_help because we need to carry in the environment
665 applyTypeEnvToTy tenv ty
668 go tenv ty@(TyVarTy tv) = case (lookupTyVarEnv tenv tv) of
671 go tenv ty@(TyConTy tycon usage) = ty
672 go tenv (SynTy tycon tys ty) = SynTy tycon (map (go tenv) tys) (go tenv ty)
673 go tenv (FunTy arg res usage) = FunTy (go tenv arg) (go tenv res) usage
674 go tenv (AppTy fun arg) = AppTy (go tenv fun) (go tenv arg)
675 go tenv (DictTy clas ty usage) = DictTy clas (go tenv ty) usage
676 go tenv (ForAllUsageTy uvar bds ty) = ForAllUsageTy uvar bds (go tenv ty)
677 go tenv (ForAllTy tv ty) = ForAllTy tv (go tenv' ty)
679 tenv' = case lookupTyVarEnv tenv tv of
681 Just _ -> delFromTyVarEnv tenv tv
686 :: Ord3 u => [(u, GenType t u')] -> GenType t u -> GenType t u'
688 instantiateUsage = panic "instantiateUsage: not implemented"
692 At present there are no unboxed non-primitive types, so
693 isUnboxedType is the same as isPrimType.
695 We're a bit cavalier about finding out whether something is
696 primitive/unboxed or not. Rather than deal with the type
697 arguemnts we just zoom into the function part of the type.
698 That is, given (T a) we just recurse into the "T" part,
702 isPrimType, isUnboxedType :: Type -> Bool
704 isPrimType (AppTy ty _) = isPrimType ty
705 isPrimType (SynTy _ _ ty) = isPrimType ty
706 isPrimType (TyConTy tycon _) = case maybeNewTyCon tycon of
707 Just (tyvars, ty) -> isPrimType ty
708 Nothing -> isPrimTyCon tycon
712 isUnboxedType = isPrimType
715 This is *not* right: it is a placeholder (ToDo 96/03 WDP):
717 typePrimRep :: Type -> PrimRep
719 typePrimRep (SynTy _ _ ty) = typePrimRep ty
720 typePrimRep (AppTy ty _) = typePrimRep ty
721 typePrimRep (TyConTy tc _)
722 | isPrimTyCon tc = case (assocMaybe tc_primrep_list (uniqueOf tc)) of
724 Nothing -> panic "Type.typePrimRep" -- pprPanic "typePrimRep:" (pprTyCon PprDebug tc)
726 | otherwise = case maybeNewTyCon tc of
727 Just (tyvars, ty) | isPrimType ty -> typePrimRep ty
728 _ -> PtrRep -- Default
730 typePrimRep _ = PtrRep -- the "default"
733 = [(addrPrimTyConKey, AddrRep)
734 ,(arrayPrimTyConKey, ArrayRep)
735 ,(byteArrayPrimTyConKey, ByteArrayRep)
736 ,(charPrimTyConKey, CharRep)
737 ,(doublePrimTyConKey, DoubleRep)
738 ,(floatPrimTyConKey, FloatRep)
739 ,(foreignObjPrimTyConKey, ForeignObjRep)
740 ,(intPrimTyConKey, IntRep)
741 ,(mutableArrayPrimTyConKey, ArrayRep)
742 ,(mutableByteArrayPrimTyConKey, ByteArrayRep)
743 ,(stablePtrPrimTyConKey, StablePtrRep)
744 ,(statePrimTyConKey, VoidRep)
745 ,(synchVarPrimTyConKey, PtrRep)
746 ,(voidTyConKey, VoidRep)
747 ,(wordPrimTyConKey, WordRep)
751 %************************************************************************
753 \subsection{Matching on types}
755 %************************************************************************
757 Matching is a {\em unidirectional} process, matching a type against a
758 template (which is just a type with type variables in it). The
759 matcher assumes that there are no repeated type variables in the
760 template, so that it simply returns a mapping of type variables to
761 types. It also fails on nested foralls.
763 @matchTys@ matches corresponding elements of a list of templates and
767 matchTy :: GenType t1 u1 -- Template
768 -> GenType t2 u2 -- Proposed instance of template
769 -> Maybe [(t1,GenType t2 u2)] -- Matching substitution
772 matchTys :: [GenType t1 u1] -- Templates
773 -> [GenType t2 u2] -- Proposed instance of template
774 -> Maybe ([(t1,GenType t2 u2)],-- Matching substitution
775 [GenType t2 u2]) -- Left over instance types
777 matchTy ty1 ty2 = match ty1 ty2 (\s -> Just s) []
778 matchTys tys1 tys2 = go [] tys1 tys2
780 go s [] tys2 = Just (s,tys2)
781 go s (ty1:tys1) [] = trace "matchTys" Nothing
782 go s (ty1:tys1) (ty2:tys2) = match ty1 ty2 (\s' -> go s' tys1 tys2) s
785 @match@ is the main function.
788 match :: GenType t1 u1 -> GenType t2 u2 -- Current match pair
789 -> ([(t1, GenType t2 u2)] -> Maybe result) -- Continuation
790 -> [(t1, GenType t2 u2)] -- Current substitution
793 match (TyVarTy v) ty k = \s -> k ((v,ty) : s)
794 match (FunTy fun1 arg1 _) (FunTy fun2 arg2 _) k = match fun1 fun2 (match arg1 arg2 k)
795 match (AppTy fun1 arg1) (AppTy fun2 arg2) k = match fun1 fun2 (match arg1 arg2 k)
796 match (TyConTy con1 _) (TyConTy con2 _) k | con1 == con2 = k
797 match (DictTy clas1 ty1 _) (DictTy clas2 ty2 _) k | clas1 == clas2 = match ty1 ty2 k
798 match (SynTy _ _ ty1) ty2 k = match ty1 ty2 k
799 match ty1 (SynTy _ _ ty2) k = match ty1 ty2 k
801 -- With type synonyms, we have to be careful for the exact
802 -- same reasons as in the unifier. Please see the
803 -- considerable commentary there before changing anything
807 match _ _ _ = \s -> Nothing
810 %************************************************************************
812 \subsection{Equality on types}
814 %************************************************************************
816 The functions eqSimpleTy and eqSimpleTheta are polymorphic in the types t
817 and u, but ONLY WORK FOR SIMPLE TYPES (ie. they panic if they see
818 dictionaries or polymorphic types). The function eqTy has a more
819 specific type, but does the `right thing' for all types.
822 eqSimpleTheta :: (Eq t,Eq u) =>
823 [(Class,GenType t u)] -> [(Class,GenType t u)] -> Bool
825 eqSimpleTheta [] [] = True
826 eqSimpleTheta ((c1,t1):th1) ((c2,t2):th2) =
827 c1==c2 && t1 `eqSimpleTy` t2 && th1 `eqSimpleTheta` th2
828 eqSimpleTheta other1 other2 = False
832 eqSimpleTy :: (Eq t,Eq u) => GenType t u -> GenType t u -> Bool
834 (TyVarTy tv1) `eqSimpleTy` (TyVarTy tv2) =
836 (AppTy f1 a1) `eqSimpleTy` (AppTy f2 a2) =
837 f1 `eqSimpleTy` f2 && a1 `eqSimpleTy` a2
838 (TyConTy tc1 u1) `eqSimpleTy` (TyConTy tc2 u2) =
839 tc1 == tc2 --ToDo: later: && u1 == u2
841 (FunTy f1 a1 u1) `eqSimpleTy` (FunTy f2 a2 u2) =
842 f1 `eqSimpleTy` f2 && a1 `eqSimpleTy` a2 && u1 == u2
843 (FunTy f1 a1 u1) `eqSimpleTy` t2 =
844 -- Expand t1 just in case t2 matches that version
845 (AppTy (AppTy (TyConTy mkFunTyCon u1) f1) a1) `eqSimpleTy` t2
846 t1 `eqSimpleTy` (FunTy f2 a2 u2) =
847 -- Expand t2 just in case t1 matches that version
848 t1 `eqSimpleTy` (AppTy (AppTy (TyConTy mkFunTyCon u2) f2) a2)
850 (SynTy tc1 ts1 t1) `eqSimpleTy` (SynTy tc2 ts2 t2) =
851 (tc1 == tc2 && and (zipWith eqSimpleTy ts1 ts2) && length ts1 == length ts2)
852 || t1 `eqSimpleTy` t2
853 (SynTy _ _ t1) `eqSimpleTy` t2 =
854 t1 `eqSimpleTy` t2 -- Expand the abbrevation and try again
855 t1 `eqSimpleTy` (SynTy _ _ t2) =
856 t1 `eqSimpleTy` t2 -- Expand the abbrevation and try again
858 (DictTy _ _ _) `eqSimpleTy` _ = panic "eqSimpleTy: got DictTy"
859 _ `eqSimpleTy` (DictTy _ _ _) = panic "eqSimpleTy: got DictTy"
861 (ForAllTy _ _) `eqSimpleTy` _ = panic "eqSimpleTy: got ForAllTy"
862 _ `eqSimpleTy` (ForAllTy _ _) = panic "eqSimpleTy: got ForAllTy"
864 (ForAllUsageTy _ _ _) `eqSimpleTy` _ = panic "eqSimpleTy: got ForAllUsageTy"
865 _ `eqSimpleTy` (ForAllUsageTy _ _ _) = panic "eqSimpleTy: got ForAllUsageTy"
867 _ `eqSimpleTy` _ = False
870 Types are ordered so we can sort on types in the renamer etc. DNT: Since
871 this class is also used in CoreLint and other such places, we DO expand out
872 Fun/Syn/Dict types (if necessary).
875 eqTy :: Type -> Type -> Bool
878 eq nullTyVarEnv nullUVarEnv t1 t2
880 eq tve uve (TyVarTy tv1) (TyVarTy tv2) =
882 case (lookupTyVarEnv tve tv1) of
885 eq tve uve (AppTy f1 a1) (AppTy f2 a2) =
886 eq tve uve f1 f2 && eq tve uve a1 a2
887 eq tve uve (TyConTy tc1 u1) (TyConTy tc2 u2) =
888 tc1 == tc2 -- ToDo: LATER: && eqUsage uve u1 u2
890 eq tve uve (FunTy f1 a1 u1) (FunTy f2 a2 u2) =
891 eq tve uve f1 f2 && eq tve uve a1 a2 && eqUsage uve u1 u2
892 eq tve uve (FunTy f1 a1 u1) t2 =
893 -- Expand t1 just in case t2 matches that version
894 eq tve uve (AppTy (AppTy (TyConTy mkFunTyCon u1) f1) a1) t2
895 eq tve uve t1 (FunTy f2 a2 u2) =
896 -- Expand t2 just in case t1 matches that version
897 eq tve uve t1 (AppTy (AppTy (TyConTy mkFunTyCon u2) f2) a2)
899 eq tve uve (DictTy c1 t1 u1) (DictTy c2 t2 u2)
901 = eq tve uve t1 t2 && eqUsage uve u1 u2
902 -- NB we use a guard for c1==c2 so that if they aren't equal we
903 -- fall through into expanding the type. Why? Because brain-dead
904 -- people might write
905 -- class Foo a => Baz a where {}
906 -- and that means that a Foo dictionary and a Baz dictionary are identical
907 -- Sigh. Let's hope we don't spend too much time in here!
909 eq tve uve t1@(DictTy _ _ _) t2 =
910 eq tve uve (expandTy t1) t2 -- Expand the dictionary and try again
911 eq tve uve t1 t2@(DictTy _ _ _) =
912 eq tve uve t1 (expandTy t2) -- Expand the dictionary and try again
914 eq tve uve (SynTy tc1 ts1 t1) (SynTy tc2 ts2 t2) =
915 (tc1 == tc2 && and (zipWith (eq tve uve) ts1 ts2) && length ts1 == length ts2)
917 eq tve uve (SynTy _ _ t1) t2 =
918 eq tve uve t1 t2 -- Expand the abbrevation and try again
919 eq tve uve t1 (SynTy _ _ t2) =
920 eq tve uve t1 t2 -- Expand the abbrevation and try again
922 eq tve uve (ForAllTy tv1 t1) (ForAllTy tv2 t2) =
923 eq (addOneToTyVarEnv tve tv1 tv2) uve t1 t2
924 eq tve uve (ForAllUsageTy u1 b1 t1) (ForAllUsageTy u2 b2 t2) =
925 eqBounds uve b1 b2 && eq tve (addOneToUVarEnv uve u1 u2) t1 t2
929 eqBounds uve [] [] = True
930 eqBounds uve (u1:b1) (u2:b2) = eqUVar uve u1 u2 && eqBounds uve b1 b2
931 eqBounds uve _ _ = False