5 mkTyVarTy, mkTyVarTys, getTyVar, getTyVar_maybe, isTyVarTy,
7 mkAppTy, mkAppTys, splitAppTy, splitAppTys,
9 mkFunTy, mkFunTys, splitFunTy_maybe, splitFunTys,
11 mkTyConApp, mkTyConTy, splitTyConApp_maybe,
12 splitAlgTyConApp_maybe, splitAlgTyConApp,
13 mkDictTy, splitDictTy_maybe, isDictTy,
17 mkForAllTy, mkForAllTys, splitForAllTy_maybe, splitForAllTys, applyTy,
19 TauType, RhoType, SigmaType, ThetaType,
22 mkSigmaTy, splitSigmaTy,
24 isUnpointedType, isUnboxedType, typePrimRep,
28 tyVarsOfType, tyVarsOfTypes, namesOfType, typeKind,
30 instantiateTy, instantiateTauTy, instantiateThetaTy,
35 #include "HsVersions.h"
37 import {-# SOURCE #-} Id ( Id )
40 import Class ( classTyCon, Class )
41 import Kind ( mkBoxedTypeKind, resultKind, Kind )
42 import TyCon ( mkFunTyCon, isFunTyCon, isEnumerationTyCon, isTupleTyCon, maybeTyConSingleCon,
43 isPrimTyCon, isAlgTyCon, isSynTyCon, tyConArity,
44 tyConKind, tyConDataCons, getSynTyConDefn,
45 tyConPrimRep, tyConClass_maybe, TyCon )
46 import TyVar ( GenTyVarSet, TyVarEnv, GenTyVar, TyVar,
47 tyVarKind, emptyTyVarSet, unionTyVarSets, minusTyVarSet,
48 unitTyVarSet, lookupTyVarEnv, delFromTyVarEnv, zipTyVarEnv, mkTyVarEnv,
49 emptyTyVarEnv, isEmptyTyVarEnv, addToTyVarEnv )
50 import Name ( NamedThing(..),
51 NameSet(..), unionNameSets, emptyNameSet, unitNameSet, minusNameSet
55 import BasicTypes ( Unused )
56 import Maybes ( maybeToBool, assocMaybe )
57 import PrimRep ( PrimRep(..) )
58 import Unique -- quite a few *Keys
59 import Util ( thenCmp, zipEqual, zipWithEqual, assoc )
65 %************************************************************************
67 \subsection{The data type}
69 %************************************************************************
73 type Type = GenType Unused -- Used after typechecker
75 data GenType flexi -- Parameterised over the "flexi" part of a type variable
76 = TyVarTy (GenTyVar flexi)
79 (GenType flexi) -- Function is *not* a TyConApp
82 | TyConApp -- Application of a TyCon
83 TyCon -- *Invariant* saturated appliations of FunTyCon and
84 -- synonyms have their own constructors, below.
85 [GenType flexi] -- Might not be saturated.
87 | FunTy -- Special case of TyConApp: TyConApp FunTyCon [t1,t2]
91 | SynTy -- Saturated application of a type synonym
92 (GenType flexi) -- The unexpanded version; always a TyConTy
93 (GenType flexi) -- The expanded version
97 (GenType flexi) -- TypeKind
101 %************************************************************************
103 \subsection{Constructor-specific functions}
105 %************************************************************************
108 ---------------------------------------------------------------------
112 mkTyVarTy :: GenTyVar flexi -> GenType flexi
115 mkTyVarTys :: [GenTyVar flexi] -> [GenType flexi]
116 mkTyVarTys = map mkTyVarTy -- a common use of mkTyVarTy
118 getTyVar :: String -> GenType flexi -> GenTyVar flexi
119 getTyVar msg (TyVarTy tv) = tv
120 getTyVar msg (SynTy _ t) = getTyVar msg t
121 getTyVar msg other = panic ("getTyVar: " ++ msg)
123 getTyVar_maybe :: GenType flexi -> Maybe (GenTyVar flexi)
124 getTyVar_maybe (TyVarTy tv) = Just tv
125 getTyVar_maybe (SynTy _ t) = getTyVar_maybe t
126 getTyVar_maybe other = Nothing
128 isTyVarTy :: GenType flexi -> Bool
129 isTyVarTy (TyVarTy tv) = True
130 isTyVarTy (SynTy _ ty) = isTyVarTy ty
131 isTyVarTy other = False
135 ---------------------------------------------------------------------
138 We need to be pretty careful with AppTy to make sure we obey the
139 invariant that a TyConApp is always visibly so. mkAppTy maintains the
143 mkAppTy orig_ty1 orig_ty2 = mk_app orig_ty1
145 mk_app (SynTy _ ty1) = mk_app ty1
146 mk_app (TyConApp tc tys) = mkTyConApp tc (tys ++ [orig_ty2])
147 mk_app ty1 = AppTy orig_ty1 orig_ty2
149 mkAppTys :: GenType flexi -> [GenType flexi] -> GenType flexi
150 mkAppTys orig_ty1 [] = orig_ty1
151 -- This check for an empty list of type arguments
152 -- avoids the needless of a type synonym constructor.
153 -- For example: mkAppTys Rational []
154 -- returns to (Ratio Integer), which has needlessly lost
155 -- the Rational part.
156 mkAppTys orig_ty1 orig_tys2 = mk_app orig_ty1
158 mk_app (SynTy _ ty1) = mk_app ty1
159 mk_app (TyConApp tc tys) = mkTyConApp tc (tys ++ orig_tys2)
160 mk_app ty1 = foldl AppTy orig_ty1 orig_tys2
162 splitAppTy :: GenType flexi -> (GenType flexi, GenType flexi)
163 splitAppTy (FunTy ty1 ty2) = (TyConApp mkFunTyCon [ty1], ty2)
164 splitAppTy (AppTy ty1 ty2) = (ty1, ty2)
165 splitAppTy (SynTy _ ty) = splitAppTy ty
166 splitAppTy (TyConApp tc tys) = split tys []
168 split [ty2] acc = (TyConApp tc (reverse acc), ty2)
169 split (ty:tys) acc = split tys (ty:acc)
170 splitAppTy other = panic "splitAppTy"
172 splitAppTys :: GenType flexi -> (GenType flexi, [GenType flexi])
173 splitAppTys ty = split ty ty []
175 split orig_ty (AppTy ty arg) args = split ty ty (arg:args)
176 split orig_ty (SynTy _ ty) args = split orig_ty ty args
177 split orig_ty (FunTy ty1 ty2) args = ASSERT( null args )
178 (TyConApp mkFunTyCon [], [ty1,ty2])
179 split orig_ty (TyConApp tc tc_args) args = (TyConApp tc [], tc_args ++ args)
180 split orig_ty ty args = (orig_ty, args)
184 ---------------------------------------------------------------------
189 mkFunTy :: GenType flexi -> GenType flexi -> GenType flexi
190 mkFunTy arg res = FunTy arg res
192 mkFunTys :: [GenType flexi] -> GenType flexi -> GenType flexi
193 mkFunTys tys ty = foldr FunTy ty tys
195 splitFunTy_maybe :: GenType flexi -> Maybe (GenType flexi, GenType flexi)
196 splitFunTy_maybe (FunTy arg res) = Just (arg, res)
197 splitFunTy_maybe (SynTy _ ty) = splitFunTy_maybe ty
198 splitFunTy_maybe other = Nothing
201 splitFunTys :: GenType flexi -> ([GenType flexi], GenType flexi)
202 splitFunTys ty = split [] ty ty
204 split args orig_ty (FunTy arg res) = split (arg:args) res res
205 split args orig_ty (SynTy _ ty) = split args orig_ty ty
206 split args orig_ty ty = (reverse args, orig_ty)
211 ---------------------------------------------------------------------
216 mkTyConApp :: TyCon -> [GenType flexi] -> GenType flexi
218 | isFunTyCon tycon && length tys == 2
220 (ty1:ty2:_) -> FunTy ty1 ty2
223 = ASSERT(not (isSynTyCon tycon))
226 mkTyConTy :: TyCon -> GenType flexi
227 mkTyConTy tycon = ASSERT( not (isSynTyCon tycon) )
230 -- splitTyConApp "looks through" synonyms, because they don't
231 -- mean a distinct type, but all other type-constructor applications
232 -- including functions are returned as Just ..
234 splitTyConApp_maybe :: GenType flexi -> Maybe (TyCon, [GenType flexi])
235 splitTyConApp_maybe (TyConApp tc tys) = Just (tc, tys)
236 splitTyConApp_maybe (FunTy arg res) = Just (mkFunTyCon, [arg,res])
237 splitTyConApp_maybe (SynTy _ ty) = splitTyConApp_maybe ty
238 splitTyConApp_maybe other = Nothing
240 -- splitAlgTyConApp_maybe looks for
241 -- *saturated* applications of *algebraic* data types
242 -- "Algebraic" => newtype, data type, or dictionary (not function types)
243 -- We return the constructors too.
245 splitAlgTyConApp_maybe :: GenType flexi -> Maybe (TyCon, [GenType flexi], [Id])
246 splitAlgTyConApp_maybe (TyConApp tc tys)
248 tyConArity tc == length tys = Just (tc, tys, tyConDataCons tc)
249 splitAlgTyConApp_maybe (SynTy _ ty) = splitAlgTyConApp_maybe ty
250 splitAlgTyConApp_maybe other = Nothing
252 splitAlgTyConApp :: GenType flexi -> (TyCon, [GenType flexi], [Id])
253 -- Here the "algebraic" property is an *assertion*
254 splitAlgTyConApp (TyConApp tc tys) = ASSERT( isAlgTyCon tc && tyConArity tc == length tys )
255 (tc, tys, tyConDataCons tc)
256 splitAlgTyConApp (SynTy _ ty) = splitAlgTyConApp ty
259 y"Dictionary" types are just ordinary data types, but you can
260 tell from the type constructor whether it's a dictionary or not.
263 mkDictTy :: Class -> [GenType flexi] -> GenType flexi
264 mkDictTy clas tys = TyConApp (classTyCon clas) tys
266 splitDictTy_maybe :: GenType flexi -> Maybe (Class, [GenType flexi])
267 splitDictTy_maybe (TyConApp tc tys)
268 | maybeToBool maybe_class
269 && tyConArity tc == length tys = Just (clas, tys)
271 maybe_class = tyConClass_maybe tc
272 Just clas = maybe_class
274 splitDictTy_maybe (SynTy _ ty) = splitDictTy_maybe ty
275 splitDictTy_maybe other = Nothing
277 isDictTy :: GenType flexi -> Bool
278 -- This version is slightly more efficient than (maybeToBool . splitDictTy)
279 isDictTy (TyConApp tc tys)
280 | maybeToBool (tyConClass_maybe tc)
281 && tyConArity tc == length tys
283 isDictTy (SynTy _ ty) = isDictTy ty
284 isDictTy other = False
288 ---------------------------------------------------------------------
293 mkSynTy syn_tycon tys
294 = ASSERT(isSynTyCon syn_tycon)
295 SynTy (TyConApp syn_tycon tys)
296 (instantiateTauTy (zipTyVarEnv tyvars tys) body)
298 (tyvars, body) = getSynTyConDefn syn_tycon
300 isSynTy (SynTy _ _) = True
301 isSynTy other = False
304 Notes on type synonyms
305 ~~~~~~~~~~~~~~~~~~~~~~
306 The various "split" functions (splitFunTy, splitRhoTy, splitForAllTy) try
307 to return type synonyms whereever possible. Thus
312 splitFunTys (a -> Foo a) = ([a], Foo a)
315 The reason is that we then get better (shorter) type signatures in
316 interfaces. Notably this plays a role in tcTySigs in TcBinds.lhs.
321 ---------------------------------------------------------------------
326 mkForAllTy = ForAllTy
328 mkForAllTys :: [GenTyVar flexi] -> GenType flexi -> GenType flexi
329 mkForAllTys tyvars ty = foldr ForAllTy ty tyvars
331 splitForAllTy_maybe :: GenType flexi -> Maybe (GenTyVar flexi, GenType flexi)
332 splitForAllTy_maybe (SynTy _ ty) = splitForAllTy_maybe ty
333 splitForAllTy_maybe (ForAllTy tyvar ty) = Just(tyvar, ty)
334 splitForAllTy_maybe _ = Nothing
336 splitForAllTys :: GenType flexi -> ([GenTyVar flexi], GenType flexi)
337 splitForAllTys ty = split ty ty []
339 split orig_ty (ForAllTy tv ty) tvs = split ty ty (tv:tvs)
340 split orig_ty (SynTy _ ty) tvs = split orig_ty ty tvs
341 split orig_ty t tvs = (reverse tvs, orig_ty)
346 applyTy :: GenType flexi -> GenType flexi -> GenType flexi
347 applyTy (SynTy _ fun) arg = applyTy fun arg
348 applyTy (ForAllTy tv ty) arg = instantiateTy (mkTyVarEnv [(tv,arg)]) ty
349 applyTy other arg = panic "applyTy"
353 %************************************************************************
355 \subsection{Stuff to do with the source-language types}
357 %************************************************************************
362 type ThetaType = [(Class, [Type])]
363 type SigmaType = Type
366 @isTauTy@ tests for nested for-alls.
369 isTauTy :: GenType flexi -> Bool
370 isTauTy (TyVarTy v) = True
371 isTauTy (TyConApp _ tys) = all isTauTy tys
372 isTauTy (AppTy a b) = isTauTy a && isTauTy b
373 isTauTy (FunTy a b) = isTauTy a && isTauTy b
374 isTauTy (SynTy _ ty) = isTauTy ty
375 isTauTy other = False
379 mkRhoTy :: [(Class, [GenType flexi])] -> GenType flexi -> GenType flexi
380 mkRhoTy theta ty = foldr (\(c,t) r -> FunTy (mkDictTy c t) r) ty theta
382 splitRhoTy :: GenType flexi -> ([(Class, [GenType flexi])], GenType flexi)
383 splitRhoTy ty = split ty ty []
385 split orig_ty (FunTy arg res) ts = case splitDictTy_maybe arg of
386 Just pair -> split res res (pair:ts)
387 Nothing -> (reverse ts, orig_ty)
388 split orig_ty (SynTy _ ty) ts = split orig_ty ty ts
389 split orig_ty ty ts = (reverse ts, orig_ty)
395 mkSigmaTy tyvars theta tau = mkForAllTys tyvars (mkRhoTy theta tau)
397 splitSigmaTy :: GenType flexi -> ([GenTyVar flexi], [(Class, [GenType flexi])], GenType flexi)
401 (tyvars,rho) = splitForAllTys ty
402 (theta,tau) = splitRhoTy rho
406 %************************************************************************
408 \subsection{Kinds and free variables}
410 %************************************************************************
412 ---------------------------------------------------------------------
413 Finding the kind of a type
414 ~~~~~~~~~~~~~~~~~~~~~~~~~~
416 typeKind :: GenType flexi -> Kind
418 typeKind (TyVarTy tyvar) = tyVarKind tyvar
419 typeKind (TyConApp tycon tys) = foldr (\_ k -> resultKind k) (tyConKind tycon) tys
420 typeKind (SynTy _ ty) = typeKind ty
421 typeKind (FunTy fun arg) = mkBoxedTypeKind
422 typeKind (AppTy fun arg) = resultKind (typeKind fun)
423 typeKind (ForAllTy _ _) = mkBoxedTypeKind
427 ---------------------------------------------------------------------
428 Free variables of a type
429 ~~~~~~~~~~~~~~~~~~~~~~~~
431 tyVarsOfType :: GenType flexi -> GenTyVarSet flexi
433 tyVarsOfType (TyVarTy tv) = unitTyVarSet tv
434 tyVarsOfType (TyConApp tycon tys) = tyVarsOfTypes tys
435 tyVarsOfType (SynTy ty1 ty2) = tyVarsOfType ty1
436 tyVarsOfType (FunTy arg res) = tyVarsOfType arg `unionTyVarSets` tyVarsOfType res
437 tyVarsOfType (AppTy fun arg) = tyVarsOfType fun `unionTyVarSets` tyVarsOfType arg
438 tyVarsOfType (ForAllTy tyvar ty) = tyVarsOfType ty `minusTyVarSet` unitTyVarSet tyvar
440 tyVarsOfTypes :: [GenType flexi] -> GenTyVarSet flexi
441 tyVarsOfTypes tys = foldr (unionTyVarSets.tyVarsOfType) emptyTyVarSet tys
443 -- Find the free names of a type, including the type constructors and classes it mentions
444 namesOfType :: GenType flexi -> NameSet
445 namesOfType (TyVarTy tv) = unitNameSet (getName tv)
446 namesOfType (TyConApp tycon tys) = unitNameSet (getName tycon) `unionNameSets`
448 namesOfType (SynTy ty1 ty2) = namesOfType ty1
449 namesOfType (FunTy arg res) = namesOfType arg `unionNameSets` namesOfType res
450 namesOfType (AppTy fun arg) = namesOfType fun `unionNameSets` namesOfType arg
451 namesOfType (ForAllTy tyvar ty) = namesOfType ty `minusNameSet` unitNameSet (getName tyvar)
453 namesOfTypes tys = foldr (unionNameSets . namesOfType) emptyNameSet tys
457 %************************************************************************
459 \subsection{Instantiating a type}
461 %************************************************************************
464 instantiateTy :: TyVarEnv (GenType flexi) -> GenType flexi -> GenType flexi
465 instantiateTauTy :: TyVarEnv (GenType flexi2) -> GenType flexi1 -> GenType flexi2
468 -- instantiateTy applies a type environment to a type.
469 -- It can handle shadowing; for example:
470 -- f = /\ t1 t2 -> \ d ->
471 -- letrec f' = /\ t1 -> \x -> ...(f' t1 x')...
473 -- Here, when we clone t1 to t1', say, we'll come across shadowing
474 -- when applying the clone environment to the type of f'.
476 -- As a sanity check, we should also check that name capture
477 -- doesn't occur, but that means keeping track of the free variables of the
478 -- range of the TyVarEnv, which I don't do just yet.
480 instantiateTy tenv ty
481 | isEmptyTyVarEnv tenv
487 go tenv ty@(TyVarTy tv) = case (lookupTyVarEnv tenv tv) of
490 go tenv (TyConApp tc tys) = TyConApp tc (map (go tenv) tys)
491 go tenv (SynTy ty1 ty2) = SynTy (go tenv ty1) (go tenv ty2)
492 go tenv (FunTy arg res) = FunTy (go tenv arg) (go tenv res)
493 go tenv (AppTy fun arg) = mkAppTy (go tenv fun) (go tenv arg)
494 go tenv (ForAllTy tv ty) = ForAllTy tv (go tenv' ty)
496 tenv' = case lookupTyVarEnv tenv tv of
498 Just _ -> delFromTyVarEnv tenv tv
500 -- instantiateTauTy works only (a) on types with no ForAlls,
501 -- and when (b) all the type variables are being instantiated
502 -- In return it is more polymorphic than instantiateTy
504 instantiateTauTy tenv ty = go ty
506 go ty@(TyVarTy tv) = case (lookupTyVarEnv tenv tv) of
507 Just ty -> ty -- Must succeed
508 go (TyConApp tc tys) = TyConApp tc (map go tys)
509 go (SynTy ty1 ty2) = SynTy (go ty1) (go ty2)
510 go (FunTy arg res) = FunTy (go arg) (go res)
511 go (AppTy fun arg) = mkAppTy (go fun) (go arg)
512 go (ForAllTy tv ty) = panic "instantiateTauTy"
515 instantiateThetaTy :: TyVarEnv Type -> ThetaType -> ThetaType
516 instantiateThetaTy tenv theta
517 = [(clas, map (instantiateTauTy tenv) tys) | (clas, tys) <- theta]
521 %************************************************************************
523 \subsection{Boxedness and pointedness}
525 %************************************************************************
528 *unboxed* iff its representation is other than a pointer
529 Unboxed types cannot instantiate a type variable
530 Unboxed types are always unpointed.
532 *unpointed* iff it can't be a thunk, and cannot have value bottom
533 An unpointed type may or may not be unboxed.
534 (E.g. Array# is unpointed, but boxed.)
535 An unpointed type *can* instantiate a type variable,
536 provided it is boxed.
538 *primitive* iff it is a built-in type that can't be expressed
541 Currently, all primitive types are unpointed, but that's not necessarily
542 the case. (E.g. Int could be primitive.)
545 isUnboxedType :: Type -> Bool
546 isUnboxedType ty = case typePrimRep ty of
550 -- Danger! Currently the unpointed types are precisely
551 -- the primitive ones, but that might not always be the case
552 isUnpointedType :: Type -> Bool
553 isUnpointedType ty = case splitTyConApp_maybe ty of
554 Just (tc, ty_args) -> isPrimTyCon tc
557 typePrimRep :: Type -> PrimRep
558 typePrimRep ty = case splitTyConApp_maybe ty of
559 Just (tc, ty_args) -> tyConPrimRep tc
564 %************************************************************************
566 \subsection{Matching on types}
568 %************************************************************************
570 Matching is a {\em unidirectional} process, matching a type against a
571 template (which is just a type with type variables in it). The
572 matcher assumes that there are no repeated type variables in the
573 template, so that it simply returns a mapping of type variables to
574 types. It also fails on nested foralls.
576 @matchTys@ matches corresponding elements of a list of templates and
580 matchTy :: GenType flexi1 -- Template
581 -> GenType flexi2 -- Proposed instance of template
582 -> Maybe (TyVarEnv (GenType flexi2)) -- Matching substitution
585 matchTys :: [GenType flexi1] -- Templates
586 -> [GenType flexi2] -- Proposed instance of template
587 -> Maybe (TyVarEnv (GenType flexi2), -- Matching substitution
588 [GenType flexi2]) -- Left over instance types
590 matchTy ty1 ty2 = match ty1 ty2 (\s -> Just s) emptyTyVarEnv
591 matchTys tys1 tys2 = match_list tys1 tys2 (\pr -> Just pr) emptyTyVarEnv
594 @match@ is the main function.
597 match :: GenType flexi1 -> GenType flexi2 -- Current match pair
598 -> (TyVarEnv (GenType flexi2) -> Maybe result) -- Continuation
599 -> TyVarEnv (GenType flexi2) -- Current substitution
602 -- When matching against a type variable, see if the variable
603 -- has already been bound. If so, check that what it's bound to
604 -- is the same as ty; if not, bind it and carry on.
606 match (TyVarTy v) ty k = \s -> case lookupTyVarEnv s v of
607 Nothing -> k (addToTyVarEnv s v ty)
608 Just ty' | ty' == ty -> k s -- Succeeds
609 | otherwise -> Nothing -- Fails
611 match (FunTy arg1 res1) (FunTy arg2 res2) k = match arg1 arg2 (match res1 res2 k)
612 match (AppTy fun1 arg1) (AppTy fun2 arg2) k = match fun1 fun2 (match arg1 arg2 k)
613 match (TyConApp tc1 tys1) (TyConApp tc2 tys2) k | tc1 == tc2
614 = match_list tys1 tys2 ( \(s,tys2') ->
621 -- With type synonyms, we have to be careful for the exact
622 -- same reasons as in the unifier. Please see the
623 -- considerable commentary there before changing anything
625 match (SynTy _ ty1) ty2 k = match ty1 ty2 k
626 match ty1 (SynTy _ ty2) k = match ty1 ty2 k
629 match _ _ _ = \s -> Nothing
631 match_list [] tys2 k = \s -> k (s, tys2)
632 match_list (ty1:tys1) [] k = panic "match_list"
633 match_list (ty1:tys1) (ty2:tys2) k = match ty1 ty2 (match_list tys1 tys2 k)
636 %************************************************************************
638 \subsection{Equality on types}
640 %************************************************************************
642 For the moment at least, type comparisons don't work if
643 there are embedded for-alls.
646 instance Eq (GenType flexi) where
647 ty1 == ty2 = case ty1 `cmpTy` ty2 of { EQ -> True; other -> False }
649 instance Ord (GenType flexi) where
650 compare ty1 ty2 = cmpTy ty1 ty2
652 cmpTy :: GenType flexi -> GenType flexi -> Ordering
654 = cmp emptyTyVarEnv ty1 ty2
656 -- The "env" maps type variables in ty1 to type variables in ty2
657 -- So when comparing for-alls.. (forall tv1 . t1) (forall tv2 . t2)
658 -- we in effect substitute tv2 for tv1 in t1 before continuing
659 lookup env tv1 = case lookupTyVarEnv env tv1 of
664 cmp env (SynTy _ ty1) ty2 = cmp env ty1 ty2
665 cmp env ty1 (SynTy _ ty2) = cmp env ty1 ty2
667 -- Deal with equal constructors
668 cmp env (TyVarTy tv1) (TyVarTy tv2) = lookup env tv1 `compare` tv2
669 cmp env (AppTy f1 a1) (AppTy f2 a2) = cmp env f1 f2 `thenCmp` cmp env a1 a2
670 cmp env (FunTy f1 a1) (FunTy f2 a2) = cmp env f1 f2 `thenCmp` cmp env a1 a2
671 cmp env (TyConApp tc1 tys1) (TyConApp tc2 tys2) = (tc1 `compare` tc2) `thenCmp` (cmps env tys1 tys2)
672 cmp env (ForAllTy tv1 t1) (ForAllTy tv2 t2) = cmp (addToTyVarEnv env tv1 tv2) t1 t2
674 -- Deal with the rest: TyVarTy < AppTy < FunTy < TyConApp < ForAllTy
675 cmp env (AppTy _ _) (TyVarTy _) = GT
677 cmp env (FunTy _ _) (TyVarTy _) = GT
678 cmp env (FunTy _ _) (AppTy _ _) = GT
680 cmp env (TyConApp _ _) (TyVarTy _) = GT
681 cmp env (TyConApp _ _) (AppTy _ _) = GT
682 cmp env (TyConApp _ _) (FunTy _ _) = GT
684 cmp env (ForAllTy _ _) other = GT
689 cmps env (t:ts) [] = GT
690 cmps env [] (t:ts) = LT
691 cmps env (t1:t1s) (t2:t2s) = cmp env t1 t2 `thenCmp` cmps env t1s t2s
696 %************************************************************************
700 %************************************************************************
705 showTypeCategory :: Type -> Char
707 {C,I,F,D} char, int, float, double
709 S other single-constructor type
710 {c,i,f,d} unboxed ditto
712 s *unpacked" single-cons...
718 + dictionary, unless it's a ...
721 M other (multi-constructor) data-con type
723 - reserved for others to mark as "uninteresting"
729 case splitTyConApp_maybe ty of
730 Nothing -> if maybeToBool (splitFunTy_maybe ty)
735 let utc = uniqueOf tycon in
736 if utc == charDataConKey then 'C'
737 else if utc == intDataConKey then 'I'
738 else if utc == floatDataConKey then 'F'
739 else if utc == doubleDataConKey then 'D'
740 else if utc == integerDataConKey then 'J'
741 else if utc == charPrimTyConKey then 'c'
742 else if (utc == intPrimTyConKey || utc == wordPrimTyConKey
743 || utc == addrPrimTyConKey) then 'i'
744 else if utc == floatPrimTyConKey then 'f'
745 else if utc == doublePrimTyConKey then 'd'
746 else if isPrimTyCon tycon {- array, we hope -} then 'A'
747 else if isEnumerationTyCon tycon then 'E'
748 else if isTupleTyCon tycon then 'T'
749 else if maybeToBool (maybeTyConSingleCon tycon) then 'S'
750 else if utc == listTyConKey then 'L'
751 else 'M' -- oh, well...