2 % (c) The GRASP/AQUA Project, Glasgow University, 1998
4 \section[Type]{Type - public interface}
8 -- re-exports from TypeRep:
9 Type, PredType, ThetaType,
12 superKind, superBoxity, -- KX and BX respectively
13 liftedBoxity, unliftedBoxity, -- :: BX
15 typeCon, -- :: BX -> KX
16 liftedTypeKind, unliftedTypeKind, openTypeKind, -- :: KX
17 mkArrowKind, mkArrowKinds, -- :: KX -> KX -> KX
18 isTypeKind, isAnyTypeKind,
21 -- exports from this module:
22 hasMoreBoxityInfo, defaultKind,
24 mkTyVarTy, mkTyVarTys, getTyVar, getTyVar_maybe, isTyVarTy,
26 mkAppTy, mkAppTys, splitAppTy, splitAppTys, splitAppTy_maybe,
28 mkFunTy, mkFunTys, splitFunTy, splitFunTy_maybe, splitFunTys,
29 funResultTy, funArgTy, zipFunTys, isFunTy,
31 mkGenTyConApp, mkTyConApp, mkTyConTy,
32 tyConAppTyCon, tyConAppArgs,
33 splitTyConApp_maybe, splitTyConApp,
39 mkForAllTy, mkForAllTys, splitForAllTy_maybe, splitForAllTys,
40 applyTy, applyTys, isForAllTy, dropForAlls,
43 SourceType(..), sourceTypeRep, mkPredTy, mkPredTys,
49 isUnLiftedType, isUnboxedTupleType, isAlgType, isStrictType, isPrimitiveType,
52 tyVarsOfType, tyVarsOfTypes, tyVarsOfPred, tyVarsOfTheta,
53 typeKind, addFreeTyVars,
55 -- Tidying up for printing
57 tidyOpenType, tidyOpenTypes,
58 tidyTyVarBndr, tidyFreeTyVars,
59 tidyOpenTyVar, tidyOpenTyVars,
60 tidyTopType, tidyPred,
70 #include "HsVersions.h"
72 -- We import the representation and primitive functions from TypeRep.
73 -- Many things are reexported, but not the representation!
79 import {-# SOURCE #-} PprType( pprType ) -- Only called in debug messages
80 import {-# SOURCE #-} Subst ( substTyWith )
83 import Var ( Id, TyVar, tyVarKind, tyVarName, setTyVarName )
87 import Name ( NamedThing(..), mkInternalName, tidyOccName )
88 import Class ( Class, classTyCon )
89 import TyCon ( TyCon, isRecursiveTyCon, isPrimTyCon,
90 isUnboxedTupleTyCon, isUnLiftedTyCon,
91 isFunTyCon, isNewTyCon, newTyConRep,
92 isAlgTyCon, isSynTyCon, tyConArity,
93 tyConKind, getSynTyConDefn,
98 import CmdLineOpts ( opt_DictsStrict )
99 import SrcLoc ( noSrcLoc )
100 import PrimRep ( PrimRep(..) )
101 import Unique ( Uniquable(..) )
102 import Util ( mapAccumL, seqList, lengthIs, snocView )
104 import UniqSet ( sizeUniqSet ) -- Should come via VarSet
105 import Maybe ( isJust )
109 %************************************************************************
111 \subsection{Stuff to do with kinds.}
113 %************************************************************************
116 hasMoreBoxityInfo :: Kind -> Kind -> Bool
117 -- (k1 `hasMoreBoxityInfo` k2) checks that k1 <: k2
118 hasMoreBoxityInfo k1 k2
119 | k2 `eqKind` openTypeKind = isAnyTypeKind k1
120 | otherwise = k1 `eqKind` k2
123 isAnyTypeKind :: Kind -> Bool
124 -- True of kind * and *# and ?
125 isAnyTypeKind (TyConApp tc _) = tc == typeCon || tc == openKindCon
126 isAnyTypeKind (NoteTy _ k) = isAnyTypeKind k
127 isAnyTypeKind other = False
129 isTypeKind :: Kind -> Bool
130 -- True of kind * and *#
131 isTypeKind (TyConApp tc _) = tc == typeCon
132 isTypeKind (NoteTy _ k) = isTypeKind k
133 isTypeKind other = False
135 defaultKind :: Kind -> Kind
136 -- Used when generalising: default kind '?' to '*'
137 defaultKind kind | kind `eqKind` openTypeKind = liftedTypeKind
142 %************************************************************************
144 \subsection{Constructor-specific functions}
146 %************************************************************************
149 ---------------------------------------------------------------------
153 mkTyVarTy :: TyVar -> Type
156 mkTyVarTys :: [TyVar] -> [Type]
157 mkTyVarTys = map mkTyVarTy -- a common use of mkTyVarTy
159 getTyVar :: String -> Type -> TyVar
160 getTyVar msg (TyVarTy tv) = tv
161 getTyVar msg (SourceTy p) = getTyVar msg (sourceTypeRep p)
162 getTyVar msg (NoteTy _ t) = getTyVar msg t
163 getTyVar msg other = panic ("getTyVar: " ++ msg)
165 getTyVar_maybe :: Type -> Maybe TyVar
166 getTyVar_maybe (TyVarTy tv) = Just tv
167 getTyVar_maybe (NoteTy _ t) = getTyVar_maybe t
168 getTyVar_maybe (SourceTy p) = getTyVar_maybe (sourceTypeRep p)
169 getTyVar_maybe other = Nothing
171 isTyVarTy :: Type -> Bool
172 isTyVarTy (TyVarTy tv) = True
173 isTyVarTy (NoteTy _ ty) = isTyVarTy ty
174 isTyVarTy (SourceTy p) = isTyVarTy (sourceTypeRep p)
175 isTyVarTy other = False
179 ---------------------------------------------------------------------
182 We need to be pretty careful with AppTy to make sure we obey the
183 invariant that a TyConApp is always visibly so. mkAppTy maintains the
187 mkAppTy orig_ty1 orig_ty2
188 = ASSERT( not (isSourceTy orig_ty1) ) -- Source types are of kind *
191 mk_app (NoteTy _ ty1) = mk_app ty1
192 mk_app (TyConApp tc tys) = mkGenTyConApp tc (tys ++ [orig_ty2])
193 mk_app ty1 = AppTy orig_ty1 orig_ty2
194 -- We call mkGenTyConApp because the TyConApp could be an
195 -- under-saturated type synonym. GHC allows that; e.g.
196 -- type Foo k = k a -> k a
198 -- foo :: Foo Id -> Foo Id
200 -- Here Id is partially applied in the type sig for Foo,
201 -- but once the type synonyms are expanded all is well
203 mkAppTys :: Type -> [Type] -> Type
204 mkAppTys orig_ty1 [] = orig_ty1
205 -- This check for an empty list of type arguments
206 -- avoids the needless loss of a type synonym constructor.
207 -- For example: mkAppTys Rational []
208 -- returns to (Ratio Integer), which has needlessly lost
209 -- the Rational part.
210 mkAppTys orig_ty1 orig_tys2
211 = ASSERT( not (isSourceTy orig_ty1) ) -- Source types are of kind *
214 mk_app (NoteTy _ ty1) = mk_app ty1
215 mk_app (TyConApp tc tys) = mkTyConApp tc (tys ++ orig_tys2)
216 mk_app ty1 = foldl AppTy orig_ty1 orig_tys2
218 splitAppTy_maybe :: Type -> Maybe (Type, Type)
219 splitAppTy_maybe (FunTy ty1 ty2) = Just (TyConApp funTyCon [ty1], ty2)
220 splitAppTy_maybe (AppTy ty1 ty2) = Just (ty1, ty2)
221 splitAppTy_maybe (NoteTy _ ty) = splitAppTy_maybe ty
222 splitAppTy_maybe (SourceTy p) = splitAppTy_maybe (sourceTypeRep p)
223 splitAppTy_maybe (TyConApp tc tys) = case snocView tys of
225 Just (tys',ty') -> Just (TyConApp tc tys', ty')
226 splitAppTy_maybe other = Nothing
228 splitAppTy :: Type -> (Type, Type)
229 splitAppTy ty = case splitAppTy_maybe ty of
231 Nothing -> panic "splitAppTy"
233 splitAppTys :: Type -> (Type, [Type])
234 splitAppTys ty = split ty ty []
236 split orig_ty (AppTy ty arg) args = split ty ty (arg:args)
237 split orig_ty (NoteTy _ ty) args = split orig_ty ty args
238 split orig_ty (SourceTy p) args = split orig_ty (sourceTypeRep p) args
239 split orig_ty (FunTy ty1 ty2) args = ASSERT( null args )
240 (TyConApp funTyCon [], [ty1,ty2])
241 split orig_ty (TyConApp tc tc_args) args = (TyConApp tc [], tc_args ++ args)
242 split orig_ty ty args = (orig_ty, args)
246 ---------------------------------------------------------------------
251 mkFunTy :: Type -> Type -> Type
252 mkFunTy arg res = FunTy arg res
254 mkFunTys :: [Type] -> Type -> Type
255 mkFunTys tys ty = foldr FunTy ty tys
257 isFunTy :: Type -> Bool
258 isFunTy ty = isJust (splitFunTy_maybe ty)
260 splitFunTy :: Type -> (Type, Type)
261 splitFunTy (FunTy arg res) = (arg, res)
262 splitFunTy (NoteTy _ ty) = splitFunTy ty
263 splitFunTy (SourceTy p) = splitFunTy (sourceTypeRep p)
265 splitFunTy_maybe :: Type -> Maybe (Type, Type)
266 splitFunTy_maybe (FunTy arg res) = Just (arg, res)
267 splitFunTy_maybe (NoteTy _ ty) = splitFunTy_maybe ty
268 splitFunTy_maybe (SourceTy p) = splitFunTy_maybe (sourceTypeRep p)
269 splitFunTy_maybe other = Nothing
271 splitFunTys :: Type -> ([Type], Type)
272 splitFunTys ty = split [] ty ty
274 split args orig_ty (FunTy arg res) = split (arg:args) res res
275 split args orig_ty (NoteTy _ ty) = split args orig_ty ty
276 split args orig_ty (SourceTy p) = split args orig_ty (sourceTypeRep p)
277 split args orig_ty ty = (reverse args, orig_ty)
279 zipFunTys :: Outputable a => [a] -> Type -> ([(a,Type)], Type)
280 zipFunTys orig_xs orig_ty = split [] orig_xs orig_ty orig_ty
282 split acc [] nty ty = (reverse acc, nty)
283 split acc (x:xs) nty (FunTy arg res) = split ((x,arg):acc) xs res res
284 split acc xs nty (NoteTy _ ty) = split acc xs nty ty
285 split acc xs nty (SourceTy p) = split acc xs nty (sourceTypeRep p)
286 split acc (x:xs) nty ty = pprPanic "zipFunTys" (ppr orig_xs <+> pprType orig_ty)
288 funResultTy :: Type -> Type
289 funResultTy (FunTy arg res) = res
290 funResultTy (NoteTy _ ty) = funResultTy ty
291 funResultTy (SourceTy p) = funResultTy (sourceTypeRep p)
292 funResultTy ty = pprPanic "funResultTy" (pprType ty)
294 funArgTy :: Type -> Type
295 funArgTy (FunTy arg res) = arg
296 funArgTy (NoteTy _ ty) = funArgTy ty
297 funArgTy (SourceTy p) = funArgTy (sourceTypeRep p)
298 funArgTy ty = pprPanic "funArgTy" (pprType ty)
302 ---------------------------------------------------------------------
305 @mkTyConApp@ is a key function, because it builds a TyConApp, FunTy or SourceTy,
309 mkGenTyConApp :: TyCon -> [Type] -> Type
311 | isSynTyCon tc = mkSynTy tc tys
312 | otherwise = mkTyConApp tc tys
314 mkTyConApp :: TyCon -> [Type] -> Type
315 -- Assumes TyCon is not a SynTyCon; use mkSynTy instead for those
317 | isFunTyCon tycon, [ty1,ty2] <- tys
320 | isNewTyCon tycon, -- A saturated newtype application;
321 not (isRecursiveTyCon tycon), -- Not recursive (we don't use SourceTypes for them)
322 tys `lengthIs` tyConArity tycon -- use the SourceType form
323 = SourceTy (NType tycon tys)
326 = ASSERT(not (isSynTyCon tycon))
329 mkTyConTy :: TyCon -> Type
330 mkTyConTy tycon = ASSERT( not (isSynTyCon tycon) )
333 -- splitTyConApp "looks through" synonyms, because they don't
334 -- mean a distinct type, but all other type-constructor applications
335 -- including functions are returned as Just ..
337 tyConAppTyCon :: Type -> TyCon
338 tyConAppTyCon ty = fst (splitTyConApp ty)
340 tyConAppArgs :: Type -> [Type]
341 tyConAppArgs ty = snd (splitTyConApp ty)
343 splitTyConApp :: Type -> (TyCon, [Type])
344 splitTyConApp ty = case splitTyConApp_maybe ty of
346 Nothing -> pprPanic "splitTyConApp" (pprType ty)
348 splitTyConApp_maybe :: Type -> Maybe (TyCon, [Type])
349 splitTyConApp_maybe (TyConApp tc tys) = Just (tc, tys)
350 splitTyConApp_maybe (FunTy arg res) = Just (funTyCon, [arg,res])
351 splitTyConApp_maybe (NoteTy _ ty) = splitTyConApp_maybe ty
352 splitTyConApp_maybe (SourceTy p) = splitTyConApp_maybe (sourceTypeRep p)
353 splitTyConApp_maybe other = Nothing
357 ---------------------------------------------------------------------
363 | n_args == arity -- Exactly saturated
365 | n_args > arity -- Over-saturated
366 = case splitAt arity tys of { (as,bs) -> mkAppTys (mk_syn as) bs }
367 -- Its important to use mkAppTys, rather than (foldl AppTy),
368 -- because (mk_syn as) might well return a partially-applied
369 -- type constructor; indeed, usually will!
370 | otherwise -- Un-saturated
372 -- For the un-saturated case we build TyConApp directly
373 -- (mkTyConApp ASSERTs that the tc isn't a SynTyCon).
374 -- Here we are relying on checkValidType to find
375 -- the error. What we can't do is use mkSynTy with
376 -- too few arg tys, because that is utterly bogus.
379 mk_syn tys = NoteTy (SynNote (TyConApp tycon tys))
380 (substTyWith tyvars tys body)
382 (tyvars, body) = ASSERT( isSynTyCon tycon ) getSynTyConDefn tycon
383 arity = tyConArity tycon
387 Notes on type synonyms
388 ~~~~~~~~~~~~~~~~~~~~~~
389 The various "split" functions (splitFunTy, splitRhoTy, splitForAllTy) try
390 to return type synonyms whereever possible. Thus
395 splitFunTys (a -> Foo a) = ([a], Foo a)
398 The reason is that we then get better (shorter) type signatures in
399 interfaces. Notably this plays a role in tcTySigs in TcBinds.lhs.
404 repType looks through
408 (d) usage annotations
409 (e) [recursive] newtypes
410 It's useful in the back end.
412 Remember, non-recursive newtypes get expanded as part of the SourceTy case,
413 but recursive ones are represented by TyConApps and have to be expanded
417 repType :: Type -> Type
418 repType (ForAllTy _ ty) = repType ty
419 repType (NoteTy _ ty) = repType ty
420 repType (SourceTy p) = repType (sourceTypeRep p)
421 repType (TyConApp tc tys) | isNewTyCon tc && tys `lengthIs` tyConArity tc
422 = repType (newTypeRep tc tys)
426 typePrimRep :: Type -> PrimRep
427 typePrimRep ty = case repType ty of
428 TyConApp tc _ -> tyConPrimRep tc
430 AppTy _ _ -> PtrRep -- ??
436 ---------------------------------------------------------------------
441 mkForAllTy :: TyVar -> Type -> Type
443 = mkForAllTys [tyvar] ty
445 mkForAllTys :: [TyVar] -> Type -> Type
446 mkForAllTys tyvars ty = foldr ForAllTy ty tyvars
448 isForAllTy :: Type -> Bool
449 isForAllTy (NoteTy _ ty) = isForAllTy ty
450 isForAllTy (ForAllTy _ _) = True
451 isForAllTy other_ty = False
453 splitForAllTy_maybe :: Type -> Maybe (TyVar, Type)
454 splitForAllTy_maybe ty = splitFAT_m ty
456 splitFAT_m (NoteTy _ ty) = splitFAT_m ty
457 splitFAT_m (SourceTy p) = splitFAT_m (sourceTypeRep p)
458 splitFAT_m (ForAllTy tyvar ty) = Just(tyvar, ty)
459 splitFAT_m _ = Nothing
461 splitForAllTys :: Type -> ([TyVar], Type)
462 splitForAllTys ty = split ty ty []
464 split orig_ty (ForAllTy tv ty) tvs = split ty ty (tv:tvs)
465 split orig_ty (NoteTy _ ty) tvs = split orig_ty ty tvs
466 split orig_ty (SourceTy p) tvs = split orig_ty (sourceTypeRep p) tvs
467 split orig_ty t tvs = (reverse tvs, orig_ty)
469 dropForAlls :: Type -> Type
470 dropForAlls ty = snd (splitForAllTys ty)
473 -- (mkPiType now in CoreUtils)
475 Applying a for-all to its arguments. Lift usage annotation as required.
478 applyTy :: Type -> Type -> Type
479 applyTy (SourceTy p) arg = applyTy (sourceTypeRep p) arg
480 applyTy (NoteTy _ fun) arg = applyTy fun arg
481 applyTy (ForAllTy tv ty) arg = substTyWith [tv] [arg] ty
482 applyTy other arg = panic "applyTy"
484 applyTys :: Type -> [Type] -> Type
485 applyTys orig_fun_ty arg_tys
486 = substTyWith tvs arg_tys ty
488 (tvs, ty) = split orig_fun_ty arg_tys
490 split fun_ty [] = ([], fun_ty)
491 split (NoteTy _ fun_ty) args = split fun_ty args
492 split (SourceTy p) args = split (sourceTypeRep p) args
493 split (ForAllTy tv fun_ty) (arg:args) = case split fun_ty args of
494 (tvs, ty) -> (tv:tvs, ty)
495 split other_ty args = panic "applyTys"
496 -- No show instance for Type yet
500 %************************************************************************
502 \subsection{Source types}
504 %************************************************************************
506 A "source type" is a type that is a separate type as far as the type checker is
507 concerned, but which has low-level representation as far as the back end is concerned.
509 Source types are always lifted.
511 The key function is sourceTypeRep which gives the representation of a source type:
514 mkPredTy :: PredType -> Type
515 mkPredTy pred = SourceTy pred
517 mkPredTys :: ThetaType -> [Type]
518 mkPredTys preds = map SourceTy preds
520 sourceTypeRep :: SourceType -> Type
521 -- Convert a predicate to its "representation type";
522 -- the type of evidence for that predicate, which is actually passed at runtime
523 sourceTypeRep (IParam _ ty) = ty
524 sourceTypeRep (ClassP clas tys) = mkTyConApp (classTyCon clas) tys
525 -- Note the mkTyConApp; the classTyCon might be a newtype!
526 sourceTypeRep (NType tc tys) = newTypeRep tc tys
527 -- ToDo: Consider caching this substitution in a NType
529 isSourceTy :: Type -> Bool
530 isSourceTy (NoteTy _ ty) = isSourceTy ty
531 isSourceTy (SourceTy sty) = True
535 splitNewType_maybe :: Type -> Maybe Type
536 -- Newtypes that are recursive are reprsented by TyConApp, just
537 -- as they always were. Occasionally we want to find their representation type.
538 -- NB: remember that in this module, non-recursive newtypes are transparent
540 splitNewType_maybe ty
541 = case splitTyConApp_maybe ty of
542 Just (tc,tys) | isNewTyCon tc -> ASSERT( tys `lengthIs` tyConArity tc )
543 -- The assert should hold because repType should
544 -- only be applied to *types* (of kind *)
545 Just (newTypeRep tc tys)
548 -- A local helper function (not exported)
549 newTypeRep new_tycon tys = case newTyConRep new_tycon of
550 (tvs, rep_ty) -> substTyWith tvs tys rep_ty
554 %************************************************************************
556 \subsection{Kinds and free variables}
558 %************************************************************************
560 ---------------------------------------------------------------------
561 Finding the kind of a type
562 ~~~~~~~~~~~~~~~~~~~~~~~~~~
564 typeKind :: Type -> Kind
566 typeKind (TyVarTy tyvar) = tyVarKind tyvar
567 typeKind (TyConApp tycon tys) = foldr (\_ k -> funResultTy k) (tyConKind tycon) tys
568 typeKind (NoteTy _ ty) = typeKind ty
569 typeKind (SourceTy _) = liftedTypeKind -- Predicates are always
570 -- represented by lifted types
571 typeKind (AppTy fun arg) = funResultTy (typeKind fun)
573 typeKind (FunTy arg res) = fix_up (typeKind res)
575 fix_up (TyConApp tycon _) | tycon == typeCon
576 || tycon == openKindCon = liftedTypeKind
577 fix_up (NoteTy _ kind) = fix_up kind
579 -- The basic story is
580 -- typeKind (FunTy arg res) = typeKind res
581 -- But a function is lifted regardless of its result type
582 -- Hence the strange fix-up.
583 -- Note that 'res', being the result of a FunTy, can't have
584 -- a strange kind like (*->*).
586 typeKind (ForAllTy tv ty) = typeKind ty
590 ---------------------------------------------------------------------
591 Free variables of a type
592 ~~~~~~~~~~~~~~~~~~~~~~~~
594 tyVarsOfType :: Type -> TyVarSet
595 tyVarsOfType (TyVarTy tv) = unitVarSet tv
596 tyVarsOfType (TyConApp tycon tys) = tyVarsOfTypes tys
597 tyVarsOfType (NoteTy (FTVNote tvs) ty2) = tvs
598 tyVarsOfType (NoteTy (SynNote ty1) ty2) = tyVarsOfType ty2 -- See note [Syn] below
599 tyVarsOfType (SourceTy sty) = tyVarsOfSourceType sty
600 tyVarsOfType (FunTy arg res) = tyVarsOfType arg `unionVarSet` tyVarsOfType res
601 tyVarsOfType (AppTy fun arg) = tyVarsOfType fun `unionVarSet` tyVarsOfType arg
602 tyVarsOfType (ForAllTy tyvar ty) = tyVarsOfType ty `minusVarSet` unitVarSet tyvar
607 -- What are the free tyvars of (T x)? Empty, of course!
608 -- Here's the example that Ralf Laemmel showed me:
609 -- foo :: (forall a. C u a -> C u a) -> u
610 -- mappend :: Monoid u => u -> u -> u
612 -- bar :: Monoid u => u
613 -- bar = foo (\t -> t `mappend` t)
614 -- We have to generalise at the arg to f, and we don't
615 -- want to capture the constraint (Monad (C u a)) because
616 -- it appears to mention a. Pretty silly, but it was useful to him.
619 tyVarsOfTypes :: [Type] -> TyVarSet
620 tyVarsOfTypes tys = foldr (unionVarSet.tyVarsOfType) emptyVarSet tys
622 tyVarsOfPred :: PredType -> TyVarSet
623 tyVarsOfPred = tyVarsOfSourceType -- Just a subtype
625 tyVarsOfSourceType :: SourceType -> TyVarSet
626 tyVarsOfSourceType (IParam _ ty) = tyVarsOfType ty
627 tyVarsOfSourceType (ClassP _ tys) = tyVarsOfTypes tys
628 tyVarsOfSourceType (NType _ tys) = tyVarsOfTypes tys
630 tyVarsOfTheta :: ThetaType -> TyVarSet
631 tyVarsOfTheta = foldr (unionVarSet . tyVarsOfSourceType) emptyVarSet
633 -- Add a Note with the free tyvars to the top of the type
634 addFreeTyVars :: Type -> Type
635 addFreeTyVars ty@(NoteTy (FTVNote _) _) = ty
636 addFreeTyVars ty = NoteTy (FTVNote (tyVarsOfType ty)) ty
639 %************************************************************************
641 \subsection{TidyType}
643 %************************************************************************
645 tidyTy tidies up a type for printing in an error message, or in
648 It doesn't change the uniques at all, just the print names.
651 tidyTyVarBndr :: TidyEnv -> TyVar -> (TidyEnv, TyVar)
652 tidyTyVarBndr (tidy_env, subst) tyvar
653 = case tidyOccName tidy_env (getOccName name) of
654 (tidy', occ') -> -- New occname reqd
655 ((tidy', subst'), tyvar')
657 subst' = extendVarEnv subst tyvar tyvar'
658 tyvar' = setTyVarName tyvar name'
659 name' = mkInternalName (getUnique name) occ' noSrcLoc
660 -- Note: make a *user* tyvar, so it printes nicely
661 -- Could extract src loc, but no need.
663 name = tyVarName tyvar
665 tidyFreeTyVars :: TidyEnv -> TyVarSet -> TidyEnv
666 -- Add the free tyvars to the env in tidy form,
667 -- so that we can tidy the type they are free in
668 tidyFreeTyVars env tyvars = fst (tidyOpenTyVars env (varSetElems tyvars))
670 tidyOpenTyVars :: TidyEnv -> [TyVar] -> (TidyEnv, [TyVar])
671 tidyOpenTyVars env tyvars = mapAccumL tidyOpenTyVar env tyvars
673 tidyOpenTyVar :: TidyEnv -> TyVar -> (TidyEnv, TyVar)
674 -- Treat a new tyvar as a binder, and give it a fresh tidy name
675 tidyOpenTyVar env@(tidy_env, subst) tyvar
676 = case lookupVarEnv subst tyvar of
677 Just tyvar' -> (env, tyvar') -- Already substituted
678 Nothing -> tidyTyVarBndr env tyvar -- Treat it as a binder
680 tidyType :: TidyEnv -> Type -> Type
681 tidyType env@(tidy_env, subst) ty
684 go (TyVarTy tv) = case lookupVarEnv subst tv of
685 Nothing -> TyVarTy tv
686 Just tv' -> TyVarTy tv'
687 go (TyConApp tycon tys) = let args = map go tys
688 in args `seqList` TyConApp tycon args
689 go (NoteTy note ty) = (NoteTy $! (go_note note)) $! (go ty)
690 go (SourceTy sty) = SourceTy (tidySourceType env sty)
691 go (AppTy fun arg) = (AppTy $! (go fun)) $! (go arg)
692 go (FunTy fun arg) = (FunTy $! (go fun)) $! (go arg)
693 go (ForAllTy tv ty) = ForAllTy tvp $! (tidyType envp ty)
695 (envp, tvp) = tidyTyVarBndr env tv
697 go_note (SynNote ty) = SynNote $! (go ty)
698 go_note note@(FTVNote ftvs) = note -- No need to tidy the free tyvars
700 tidyTypes env tys = map (tidyType env) tys
702 tidyPred :: TidyEnv -> SourceType -> SourceType
703 tidyPred = tidySourceType
705 tidySourceType :: TidyEnv -> SourceType -> SourceType
706 tidySourceType env (IParam n ty) = IParam n (tidyType env ty)
707 tidySourceType env (ClassP clas tys) = ClassP clas (tidyTypes env tys)
708 tidySourceType env (NType tc tys) = NType tc (tidyTypes env tys)
712 @tidyOpenType@ grabs the free type variables, tidies them
713 and then uses @tidyType@ to work over the type itself
716 tidyOpenType :: TidyEnv -> Type -> (TidyEnv, Type)
718 = (env', tidyType env' ty)
720 env' = tidyFreeTyVars env (tyVarsOfType ty)
722 tidyOpenTypes :: TidyEnv -> [Type] -> (TidyEnv, [Type])
723 tidyOpenTypes env tys = mapAccumL tidyOpenType env tys
725 tidyTopType :: Type -> Type
726 tidyTopType ty = tidyType emptyTidyEnv ty
731 %************************************************************************
733 \subsection{Liftedness}
735 %************************************************************************
738 isUnLiftedType :: Type -> Bool
739 -- isUnLiftedType returns True for forall'd unlifted types:
740 -- x :: forall a. Int#
741 -- I found bindings like these were getting floated to the top level.
742 -- They are pretty bogus types, mind you. It would be better never to
745 isUnLiftedType (ForAllTy tv ty) = isUnLiftedType ty
746 isUnLiftedType (NoteTy _ ty) = isUnLiftedType ty
747 isUnLiftedType (TyConApp tc _) = isUnLiftedTyCon tc
748 isUnLiftedType (SourceTy _) = False -- All source types are lifted
749 isUnLiftedType other = False
751 isUnboxedTupleType :: Type -> Bool
752 isUnboxedTupleType ty = case splitTyConApp_maybe ty of
753 Just (tc, ty_args) -> isUnboxedTupleTyCon tc
756 -- Should only be applied to *types*; hence the assert
757 isAlgType :: Type -> Bool
758 isAlgType ty = case splitTyConApp_maybe ty of
759 Just (tc, ty_args) -> ASSERT( ty_args `lengthIs` tyConArity tc )
764 @isStrictType@ computes whether an argument (or let RHS) should
765 be computed strictly or lazily, based only on its type.
766 Works just like isUnLiftedType, except that it has a special case
767 for dictionaries. Since it takes account of ClassP, you might think
768 this function should be in TcType, but isStrictType is used by DataCon,
769 which is below TcType in the hierarchy, so it's convenient to put it here.
772 isStrictType (ForAllTy tv ty) = isStrictType ty
773 isStrictType (NoteTy _ ty) = isStrictType ty
774 isStrictType (TyConApp tc _) = isUnLiftedTyCon tc
775 isStrictType (SourceTy (ClassP clas _)) = opt_DictsStrict && not (isNewTyCon (classTyCon clas))
776 -- We may be strict in dictionary types, but only if it
777 -- has more than one component.
778 -- [Being strict in a single-component dictionary risks
779 -- poking the dictionary component, which is wrong.]
780 isStrictType other = False
784 isPrimitiveType :: Type -> Bool
785 -- Returns types that are opaque to Haskell.
786 -- Most of these are unlifted, but now that we interact with .NET, we
787 -- may have primtive (foreign-imported) types that are lifted
788 isPrimitiveType ty = case splitTyConApp_maybe ty of
789 Just (tc, ty_args) -> ASSERT( ty_args `lengthIs` tyConArity tc )
795 %************************************************************************
797 \subsection{Sequencing on types
799 %************************************************************************
802 seqType :: Type -> ()
803 seqType (TyVarTy tv) = tv `seq` ()
804 seqType (AppTy t1 t2) = seqType t1 `seq` seqType t2
805 seqType (FunTy t1 t2) = seqType t1 `seq` seqType t2
806 seqType (NoteTy note t2) = seqNote note `seq` seqType t2
807 seqType (SourceTy p) = seqPred p
808 seqType (TyConApp tc tys) = tc `seq` seqTypes tys
809 seqType (ForAllTy tv ty) = tv `seq` seqType ty
811 seqTypes :: [Type] -> ()
813 seqTypes (ty:tys) = seqType ty `seq` seqTypes tys
815 seqNote :: TyNote -> ()
816 seqNote (SynNote ty) = seqType ty
817 seqNote (FTVNote set) = sizeUniqSet set `seq` ()
819 seqPred :: SourceType -> ()
820 seqPred (ClassP c tys) = c `seq` seqTypes tys
821 seqPred (NType tc tys) = tc `seq` seqTypes tys
822 seqPred (IParam n ty) = n `seq` seqType ty
826 %************************************************************************
828 \subsection{Equality on types}
830 %************************************************************************
832 Comparison; don't use instances so that we know where it happens.
833 Look through newtypes but not usage types.
835 Note that eqType can respond 'False' for partial applications of newtypes.
837 newtype Parser m a = MkParser (Foogle m a)
840 Monad (Parser m) `eqType` Monad (Foogle m)
842 Well, yes, but eqType won't see that they are the same.
843 I don't think this is harmful, but it's soemthing to watch out for.
846 eqType t1 t2 = eq_ty emptyVarEnv t1 t2
847 eqKind = eqType -- No worries about looking
849 -- Look through Notes
850 eq_ty env (NoteTy _ t1) t2 = eq_ty env t1 t2
851 eq_ty env t1 (NoteTy _ t2) = eq_ty env t1 t2
853 -- Look through SourceTy. This is where the looping danger comes from
854 eq_ty env (SourceTy sty1) t2 = eq_ty env (sourceTypeRep sty1) t2
855 eq_ty env t1 (SourceTy sty2) = eq_ty env t1 (sourceTypeRep sty2)
857 -- The rest is plain sailing
858 eq_ty env (TyVarTy tv1) (TyVarTy tv2) = case lookupVarEnv env tv1 of
859 Just tv1a -> tv1a == tv2
860 Nothing -> tv1 == tv2
861 eq_ty env (ForAllTy tv1 t1) (ForAllTy tv2 t2)
862 | tv1 == tv2 = eq_ty (delVarEnv env tv1) t1 t2
863 | otherwise = eq_ty (extendVarEnv env tv1 tv2) t1 t2
864 eq_ty env (AppTy s1 t1) (AppTy s2 t2) = (eq_ty env s1 s2) && (eq_ty env t1 t2)
865 eq_ty env (FunTy s1 t1) (FunTy s2 t2) = (eq_ty env s1 s2) && (eq_ty env t1 t2)
866 eq_ty env (TyConApp tc1 tys1) (TyConApp tc2 tys2) = (tc1 == tc2) && (eq_tys env tys1 tys2)
867 eq_ty env t1 t2 = False
869 eq_tys env [] [] = True
870 eq_tys env (t1:tys1) (t2:tys2) = (eq_ty env t1 t2) && (eq_tys env tys1 tys2)
871 eq_tys env tys1 tys2 = False