2 % (c) The University of Glasgow 2006
3 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
5 \section[TcType]{Types used in the typechecker}
7 This module provides the Type interface for front-end parts of the
10 * treat "source types" as opaque:
11 newtypes, and predicates are meaningful.
12 * look through usage types
14 The "tc" prefix is for "TypeChecker", because the type checker
15 is the principal client.
19 --------------------------------
21 TcType, TcSigmaType, TcRhoType, TcTauType, TcPredType, TcThetaType,
22 TcTyVar, TcTyVarSet, TcKind,
24 BoxyTyVar, BoxySigmaType, BoxyRhoType, BoxyThetaType, BoxyType,
26 --------------------------------
28 UserTypeCtxt(..), pprUserTypeCtxt,
29 TcTyVarDetails(..), BoxInfo(..), pprTcTyVarDetails,
30 MetaDetails(Flexi, Indirect), SkolemInfo(..), pprSkolTvBinding, pprSkolInfo,
31 isImmutableTyVar, isSkolemTyVar, isMetaTyVar, isBoxyTyVar,
32 isSigTyVar, isExistentialTyVar, isTyConableTyVar,
36 --------------------------------
40 --------------------------------
42 -- These are important because they do not look through newtypes
44 tcSplitForAllTys, tcSplitPhiTy,
45 tcSplitFunTy_maybe, tcSplitFunTys, tcFunArgTy, tcFunResultTy, tcSplitFunTysN,
46 tcSplitTyConApp, tcSplitTyConApp_maybe, tcTyConAppTyCon, tcTyConAppArgs,
47 tcSplitAppTy_maybe, tcSplitAppTy, tcSplitAppTys, repSplitAppTy_maybe,
48 tcValidInstHeadTy, tcGetTyVar_maybe, tcGetTyVar,
49 tcSplitSigmaTy, tcMultiSplitSigmaTy,
51 ---------------------------------
53 -- Again, newtypes are opaque
54 tcEqType, tcEqTypes, tcEqPred, tcCmpType, tcCmpTypes, tcCmpPred, tcEqTypeX,
56 isSigmaTy, isOverloadedTy, isRigidTy, isBoxyTy,
57 isDoubleTy, isFloatTy, isIntTy, isStringTy,
58 isIntegerTy, isBoolTy, isUnitTy, isCharTy,
59 isTauTy, isTauTyCon, tcIsTyVarTy, tcIsForAllTy,
61 ---------------------------------
62 -- Misc type manipulators
64 tyClsNamesOfType, tyClsNamesOfDFunHead,
67 ---------------------------------
69 getClassPredTys_maybe, getClassPredTys,
70 isClassPred, isTyVarClassPred, isEqPred,
71 mkDictTy, tcSplitPredTy_maybe,
72 isPredTy, isDictTy, tcSplitDFunTy, tcSplitDFunHead, predTyUnique,
73 mkClassPred, isInheritablePred, isIPPred,
74 dataConsStupidTheta, isRefineableTy, isRefineablePred,
76 ---------------------------------
77 -- Foreign import and export
78 isFFIArgumentTy, -- :: DynFlags -> Safety -> Type -> Bool
79 isFFIImportResultTy, -- :: DynFlags -> Type -> Bool
80 isFFIExportResultTy, -- :: Type -> Bool
81 isFFIExternalTy, -- :: Type -> Bool
82 isFFIDynArgumentTy, -- :: Type -> Bool
83 isFFIDynResultTy, -- :: Type -> Bool
84 isFFILabelTy, -- :: Type -> Bool
85 isFFIDotnetTy, -- :: DynFlags -> Type -> Bool
86 isFFIDotnetObjTy, -- :: Type -> Bool
87 isFFITy, -- :: Type -> Bool
88 tcSplitIOType_maybe, -- :: Type -> Maybe Type
89 toDNType, -- :: Type -> DNType
91 --------------------------------
92 -- Rexported from Type
93 Kind, -- Stuff to do with kinds is insensitive to pre/post Tc
94 unliftedTypeKind, liftedTypeKind, argTypeKind,
95 openTypeKind, mkArrowKind, mkArrowKinds,
96 isLiftedTypeKind, isUnliftedTypeKind, isSubOpenTypeKind,
97 isSubArgTypeKind, isSubKind, defaultKind,
98 kindVarRef, mkKindVar,
100 Type, PredType(..), ThetaType,
101 mkForAllTy, mkForAllTys,
102 mkFunTy, mkFunTys, zipFunTys,
103 mkTyConApp, mkAppTy, mkAppTys, applyTy, applyTys,
104 mkTyVarTy, mkTyVarTys, mkTyConTy, mkPredTy, mkPredTys,
106 -- Type substitutions
107 TvSubst(..), -- Representation visible to a few friends
108 TvSubstEnv, emptyTvSubst, substEqSpec,
109 mkOpenTvSubst, zipOpenTvSubst, zipTopTvSubst, mkTopTvSubst, notElemTvSubst,
110 getTvSubstEnv, setTvSubstEnv, getTvInScope, extendTvInScope, lookupTyVar,
111 extendTvSubst, extendTvSubstList, isInScope, mkTvSubst, zipTyEnv,
112 substTy, substTys, substTyWith, substTheta, substTyVar, substTyVars, substTyVarBndr,
114 isUnLiftedType, -- Source types are always lifted
115 isUnboxedTupleType, -- Ditto
118 tidyTopType, tidyType, tidyPred, tidyTypes, tidyFreeTyVars, tidyOpenType, tidyOpenTypes,
119 tidyTyVarBndr, tidyOpenTyVar, tidyOpenTyVars, tidySkolemTyVar,
122 tyVarsOfType, tyVarsOfTypes, tyVarsOfPred, tyVarsOfTheta,
123 tcTyVarsOfType, tcTyVarsOfTypes, exactTyVarsOfType, exactTyVarsOfTypes,
125 pprKind, pprParendKind,
126 pprType, pprParendType, pprTypeApp, pprTyThingCategory,
127 pprPred, pprTheta, pprThetaArrow, pprClassPred
131 #include "HsVersions.h"
164 %************************************************************************
168 %************************************************************************
170 The type checker divides the generic Type world into the
171 following more structured beasts:
173 sigma ::= forall tyvars. phi
174 -- A sigma type is a qualified type
176 -- Note that even if 'tyvars' is empty, theta
177 -- may not be: e.g. (?x::Int) => Int
179 -- Note that 'sigma' is in prenex form:
180 -- all the foralls are at the front.
181 -- A 'phi' type has no foralls to the right of
189 -- A 'tau' type has no quantification anywhere
190 -- Note that the args of a type constructor must be taus
192 | tycon tau_1 .. tau_n
196 -- In all cases, a (saturated) type synonym application is legal,
197 -- provided it expands to the required form.
200 type TcTyVar = TyVar -- Used only during type inference
201 type TcType = Type -- A TcType can have mutable type variables
202 -- Invariant on ForAllTy in TcTypes:
204 -- a cannot occur inside a MutTyVar in T; that is,
205 -- T is "flattened" before quantifying over a
207 -- These types do not have boxy type variables in them
208 type TcPredType = PredType
209 type TcThetaType = ThetaType
210 type TcSigmaType = TcType
211 type TcRhoType = TcType
212 type TcTauType = TcType
214 type TcTyVarSet = TyVarSet
216 -- These types may have boxy type variables in them
217 type BoxyTyVar = TcTyVar
218 type BoxyRhoType = TcType
219 type BoxyThetaType = TcThetaType
220 type BoxySigmaType = TcType
221 type BoxyType = TcType
225 %************************************************************************
227 \subsection{TyVarDetails}
229 %************************************************************************
231 TyVarDetails gives extra info about type variables, used during type
232 checking. It's attached to mutable type variables only.
233 It's knot-tied back to Var.lhs. There is no reason in principle
234 why Var.lhs shouldn't actually have the definition, but it "belongs" here.
237 Note [Signature skolems]
238 ~~~~~~~~~~~~~~~~~~~~~~~~
243 (x,y,z) = ([y,z], z, head x)
245 Here, x and y have type sigs, which go into the environment. We used to
246 instantiate their types with skolem constants, and push those types into
247 the RHS, so we'd typecheck the RHS with type
249 where a*, b* are skolem constants, and c is an ordinary meta type varible.
251 The trouble is that the occurrences of z in the RHS force a* and b* to
252 be the *same*, so we can't make them into skolem constants that don't unify
253 with each other. Alas.
255 One solution would be insist that in the above defn the programmer uses
256 the same type variable in both type signatures. But that takes explanation.
258 The alternative (currently implemented) is to have a special kind of skolem
259 constant, SigTv, which can unify with other SigTvs. These are *not* treated
260 as righd for the purposes of GADTs. And they are used *only* for pattern
261 bindings and mutually recursive function bindings. See the function
262 TcBinds.tcInstSig, and its use_skols parameter.
266 -- A TyVarDetails is inside a TyVar
268 = SkolemTv SkolemInfo -- A skolem constant
270 | MetaTv BoxInfo (IORef MetaDetails)
273 = BoxTv -- The contents is a (non-boxy) sigma-type
274 -- That is, this MetaTv is a "box"
276 | TauTv -- The contents is a (non-boxy) tau-type
277 -- That is, this MetaTv is an ordinary unification variable
279 | SigTv SkolemInfo -- A variant of TauTv, except that it should not be
280 -- unified with a type, only with a type variable
281 -- SigTvs are only distinguished to improve error messages
282 -- see Note [Signature skolems]
283 -- The MetaDetails, if filled in, will
284 -- always be another SigTv or a SkolemTv
287 -- A TauTv is always filled in with a tau-type, which
288 -- never contains any BoxTvs, nor any ForAlls
290 -- However, a BoxTv can contain a type that contains further BoxTvs
291 -- Notably, when typechecking an explicit list, say [e1,e2], with
292 -- expected type being a box b1, we fill in b1 with (List b2), where
293 -- b2 is another (currently empty) box.
296 = Flexi -- Flexi type variables unify to become
299 | Indirect TcType -- INVARIANT:
300 -- For a BoxTv, this type must be non-boxy
301 -- For a TauTv, this type must be a tau-type
303 -- Generally speaking, SkolemInfo should not contain location info
304 -- that is contained in the Name of the tyvar with this SkolemInfo
306 = SigSkol UserTypeCtxt -- A skolem that is created by instantiating
307 -- a programmer-supplied type signature
308 -- Location of the binding site is on the TyVar
310 -- The rest are for non-scoped skolems
311 | ClsSkol Class -- Bound at a class decl
312 | InstSkol -- Bound at an instance decl
313 | FamInstSkol -- Bound at a family instance decl
314 | PatSkol DataCon -- An existential type variable bound by a pattern for
315 -- a data constructor with an existential type. E.g.
316 -- data T = forall a. Eq a => MkT a
318 -- The pattern MkT x will allocate an existential type
320 | ArrowSkol -- An arrow form (see TcArrows)
322 | RuleSkol RuleName -- The LHS of a RULE
323 | GenSkol [TcTyVar] -- Bound when doing a subsumption check for
324 TcType -- (forall tvs. ty)
326 | RuntimeUnkSkol -- a type variable used to represent an unknown
327 -- runtime type (used in the GHCi debugger)
329 | UnkSkol -- Unhelpful info (until I improve it)
331 -------------------------------------
332 -- UserTypeCtxt describes the places where a
333 -- programmer-written type signature can occur
334 -- Like SkolemInfo, no location info
336 = FunSigCtxt Name -- Function type signature
337 -- Also used for types in SPECIALISE pragmas
338 | ExprSigCtxt -- Expression type signature
339 | ConArgCtxt Name -- Data constructor argument
340 | TySynCtxt Name -- RHS of a type synonym decl
341 | GenPatCtxt -- Pattern in generic decl
342 -- f{| a+b |} (Inl x) = ...
343 | LamPatSigCtxt -- Type sig in lambda pattern
345 | BindPatSigCtxt -- Type sig in pattern binding pattern
347 | ResSigCtxt -- Result type sig
349 | ForSigCtxt Name -- Foreign inport or export signature
350 | DefaultDeclCtxt -- Types in a default declaration
351 | SpecInstCtxt -- SPECIALISE instance pragma
353 -- Notes re TySynCtxt
354 -- We allow type synonyms that aren't types; e.g. type List = []
356 -- If the RHS mentions tyvars that aren't in scope, we'll
357 -- quantify over them:
358 -- e.g. type T = a->a
359 -- will become type T = forall a. a->a
361 -- With gla-exts that's right, but for H98 we should complain.
363 ---------------------------------
366 mkKindName :: Unique -> Name
367 mkKindName unique = mkSystemName unique kind_var_occ
369 kindVarRef :: KindVar -> IORef MetaDetails
371 ASSERT ( isTcTyVar tc )
372 case tcTyVarDetails tc of
373 MetaTv TauTv ref -> ref
374 other -> pprPanic "kindVarRef" (ppr tc)
376 mkKindVar :: Unique -> IORef MetaDetails -> KindVar
378 = mkTcTyVar (mkKindName u)
379 tySuperKind -- not sure this is right,
380 -- do we need kind vars for
384 kind_var_occ :: OccName -- Just one for all KindVars
385 -- They may be jiggled by tidying
386 kind_var_occ = mkOccName tvName "k"
390 %************************************************************************
394 %************************************************************************
397 pprTcTyVarDetails :: TcTyVarDetails -> SDoc
399 pprTcTyVarDetails (SkolemTv _) = ptext SLIT("sk")
400 pprTcTyVarDetails (MetaTv BoxTv _) = ptext SLIT("box")
401 pprTcTyVarDetails (MetaTv TauTv _) = ptext SLIT("tau")
402 pprTcTyVarDetails (MetaTv (SigTv _) _) = ptext SLIT("sig")
404 pprUserTypeCtxt :: UserTypeCtxt -> SDoc
405 pprUserTypeCtxt (FunSigCtxt n) = ptext SLIT("the type signature for") <+> quotes (ppr n)
406 pprUserTypeCtxt ExprSigCtxt = ptext SLIT("an expression type signature")
407 pprUserTypeCtxt (ConArgCtxt c) = ptext SLIT("the type of the constructor") <+> quotes (ppr c)
408 pprUserTypeCtxt (TySynCtxt c) = ptext SLIT("the RHS of the type synonym") <+> quotes (ppr c)
409 pprUserTypeCtxt GenPatCtxt = ptext SLIT("the type pattern of a generic definition")
410 pprUserTypeCtxt LamPatSigCtxt = ptext SLIT("a pattern type signature")
411 pprUserTypeCtxt BindPatSigCtxt = ptext SLIT("a pattern type signature")
412 pprUserTypeCtxt ResSigCtxt = ptext SLIT("a result type signature")
413 pprUserTypeCtxt (ForSigCtxt n) = ptext SLIT("the foreign declaration for") <+> quotes (ppr n)
414 pprUserTypeCtxt DefaultDeclCtxt = ptext SLIT("a type in a `default' declaration")
415 pprUserTypeCtxt SpecInstCtxt = ptext SLIT("a SPECIALISE instance pragma")
418 --------------------------------
419 tidySkolemTyVar :: TidyEnv -> TcTyVar -> (TidyEnv, TcTyVar)
420 -- Tidy the type inside a GenSkol, preparatory to printing it
421 tidySkolemTyVar env tv
422 = ASSERT( isSkolemTyVar tv || isSigTyVar tv )
423 (env1, mkTcTyVar (tyVarName tv) (tyVarKind tv) info1)
425 (env1, info1) = case tcTyVarDetails tv of
426 SkolemTv info -> (env1, SkolemTv info')
428 (env1, info') = tidy_skol_info env info
429 MetaTv (SigTv info) box -> (env1, MetaTv (SigTv info') box)
431 (env1, info') = tidy_skol_info env info
434 tidy_skol_info env (GenSkol tvs ty) = (env2, GenSkol tvs1 ty1)
436 (env1, tvs1) = tidyOpenTyVars env tvs
437 (env2, ty1) = tidyOpenType env1 ty
438 tidy_skol_info env info = (env, info)
440 pprSkolTvBinding :: TcTyVar -> SDoc
441 -- Print info about the binding of a skolem tyvar,
442 -- or nothing if we don't have anything useful to say
444 = ASSERT ( isTcTyVar tv )
445 ppr_details (tcTyVarDetails tv)
447 ppr_details (MetaTv TauTv _) = quotes (ppr tv) <+> ptext SLIT("is a meta type variable")
448 ppr_details (MetaTv BoxTv _) = quotes (ppr tv) <+> ptext SLIT("is a boxy type variable")
449 ppr_details (MetaTv (SigTv info) _) = ppr_skol info
450 ppr_details (SkolemTv info) = ppr_skol info
452 ppr_skol UnkSkol = empty -- Unhelpful; omit
453 ppr_skol RuntimeUnkSkol = quotes (ppr tv) <+> ptext SLIT("is an unknown runtime type")
454 ppr_skol info = quotes (ppr tv) <+> ptext SLIT("is bound by")
455 <+> sep [pprSkolInfo info, nest 2 (ptext SLIT("at") <+> ppr (getSrcLoc tv))]
457 pprSkolInfo :: SkolemInfo -> SDoc
458 pprSkolInfo (SigSkol ctxt) = pprUserTypeCtxt ctxt
459 pprSkolInfo (ClsSkol cls) = ptext SLIT("the class declaration for") <+> quotes (ppr cls)
460 pprSkolInfo InstSkol = ptext SLIT("the instance declaration")
461 pprSkolInfo FamInstSkol = ptext SLIT("the family instance declaration")
462 pprSkolInfo (RuleSkol name) = ptext SLIT("the RULE") <+> doubleQuotes (ftext name)
463 pprSkolInfo ArrowSkol = ptext SLIT("the arrow form")
464 pprSkolInfo (PatSkol dc) = sep [ptext SLIT("the constructor") <+> quotes (ppr dc)]
465 pprSkolInfo (GenSkol tvs ty) = sep [ptext SLIT("the polymorphic type"),
466 nest 2 (quotes (ppr (mkForAllTys tvs ty)))]
469 -- For type variables the others are dealt with by pprSkolTvBinding.
470 -- For Insts, these cases should not happen
471 pprSkolInfo UnkSkol = panic "UnkSkol"
472 pprSkolInfo RuntimeUnkSkol = panic "RuntimeUnkSkol"
474 instance Outputable MetaDetails where
475 ppr Flexi = ptext SLIT("Flexi")
476 ppr (Indirect ty) = ptext SLIT("Indirect") <+> ppr ty
480 %************************************************************************
484 %************************************************************************
487 isImmutableTyVar :: TyVar -> Bool
490 | isTcTyVar tv = isSkolemTyVar tv
493 isTyConableTyVar, isSkolemTyVar, isExistentialTyVar,
494 isBoxyTyVar, isMetaTyVar :: TcTyVar -> Bool
497 -- True of a meta-type variable tha can be filled in
498 -- with a type constructor application; in particular,
500 = ASSERT( isTcTyVar tv)
501 case tcTyVarDetails tv of
502 MetaTv BoxTv _ -> True
503 MetaTv TauTv _ -> True
504 MetaTv (SigTv {}) _ -> False
508 = ASSERT( isTcTyVar tv )
509 case tcTyVarDetails tv of
513 isExistentialTyVar tv -- Existential type variable, bound by a pattern
514 = ASSERT( isTcTyVar tv )
515 case tcTyVarDetails tv of
516 SkolemTv (PatSkol {}) -> True
520 = ASSERT2( isTcTyVar tv, ppr tv )
521 case tcTyVarDetails tv of
526 = ASSERT( isTcTyVar tv )
527 case tcTyVarDetails tv of
528 MetaTv BoxTv _ -> True
532 = ASSERT( isTcTyVar tv )
533 case tcTyVarDetails tv of
534 MetaTv (SigTv _) _ -> True
537 metaTvRef :: TyVar -> IORef MetaDetails
539 = ASSERT( isTcTyVar tv )
540 case tcTyVarDetails tv of
542 other -> pprPanic "metaTvRef" (ppr tv)
544 isFlexi, isIndirect :: MetaDetails -> Bool
546 isFlexi other = False
548 isIndirect (Indirect _) = True
549 isIndirect other = False
553 %************************************************************************
555 \subsection{Tau, sigma and rho}
557 %************************************************************************
560 mkSigmaTy :: [TyVar] -> [PredType] -> Type -> Type
561 mkSigmaTy tyvars theta tau = mkForAllTys tyvars (mkPhiTy theta tau)
563 mkPhiTy :: [PredType] -> Type -> Type
564 mkPhiTy theta ty = foldr (\p r -> mkFunTy (mkPredTy p) r) ty theta
567 @isTauTy@ tests for nested for-alls. It should not be called on a boxy type.
570 isTauTy :: Type -> Bool
571 isTauTy ty | Just ty' <- tcView ty = isTauTy ty'
572 isTauTy (TyVarTy tv) = ASSERT( not (isTcTyVar tv && isBoxyTyVar tv) )
574 isTauTy (TyConApp tc tys) = all isTauTy tys && isTauTyCon tc
575 isTauTy (AppTy a b) = isTauTy a && isTauTy b
576 isTauTy (FunTy a b) = isTauTy a && isTauTy b
577 isTauTy (PredTy p) = True -- Don't look through source types
578 isTauTy other = False
581 isTauTyCon :: TyCon -> Bool
582 -- Returns False for type synonyms whose expansion is a polytype
584 | isClosedSynTyCon tc = isTauTy (snd (synTyConDefn tc))
588 isBoxyTy :: TcType -> Bool
589 isBoxyTy ty = any isBoxyTyVar (varSetElems (tcTyVarsOfType ty))
591 isRigidTy :: TcType -> Bool
592 -- A type is rigid if it has no meta type variables in it
593 isRigidTy ty = all isImmutableTyVar (varSetElems (tcTyVarsOfType ty))
595 isRefineableTy :: TcType -> Bool
596 -- A type should have type refinements applied to it if it has
597 -- free type variables, and they are all rigid
598 isRefineableTy ty = not (null tc_tvs) && all isImmutableTyVar tc_tvs
600 tc_tvs = varSetElems (tcTyVarsOfType ty)
602 isRefineablePred :: TcPredType -> Bool
603 isRefineablePred pred = not (null tc_tvs) && all isImmutableTyVar tc_tvs
605 tc_tvs = varSetElems (tcTyVarsOfPred pred)
608 getDFunTyKey :: Type -> OccName -- Get some string from a type, to be used to
609 -- construct a dictionary function name
610 getDFunTyKey ty | Just ty' <- tcView ty = getDFunTyKey ty'
611 getDFunTyKey (TyVarTy tv) = getOccName tv
612 getDFunTyKey (TyConApp tc _) = getOccName tc
613 getDFunTyKey (AppTy fun _) = getDFunTyKey fun
614 getDFunTyKey (FunTy arg _) = getOccName funTyCon
615 getDFunTyKey (ForAllTy _ t) = getDFunTyKey t
616 getDFunTyKey ty = pprPanic "getDFunTyKey" (pprType ty)
617 -- PredTy shouldn't happen
621 %************************************************************************
623 \subsection{Expanding and splitting}
625 %************************************************************************
627 These tcSplit functions are like their non-Tc analogues, but
628 a) they do not look through newtypes
629 b) they do not look through PredTys
630 c) [future] they ignore usage-type annotations
632 However, they are non-monadic and do not follow through mutable type
633 variables. It's up to you to make sure this doesn't matter.
636 tcSplitForAllTys :: Type -> ([TyVar], Type)
637 tcSplitForAllTys ty = split ty ty []
639 split orig_ty ty tvs | Just ty' <- tcView ty = split orig_ty ty' tvs
640 split orig_ty (ForAllTy tv ty) tvs
641 | not (isCoVar tv) = split ty ty (tv:tvs)
642 split orig_ty t tvs = (reverse tvs, orig_ty)
644 tcIsForAllTy ty | Just ty' <- tcView ty = tcIsForAllTy ty'
645 tcIsForAllTy (ForAllTy tv ty) = not (isCoVar tv)
646 tcIsForAllTy t = False
648 tcSplitPhiTy :: Type -> (ThetaType, Type)
649 tcSplitPhiTy ty = split ty ty []
651 split orig_ty ty tvs | Just ty' <- tcView ty = split orig_ty ty' tvs
653 split orig_ty (ForAllTy tv ty) ts
654 | isCoVar tv = split ty ty (eq_pred:ts)
656 PredTy eq_pred = tyVarKind tv
657 split orig_ty (FunTy arg res) ts
658 | Just p <- tcSplitPredTy_maybe arg = split res res (p:ts)
659 split orig_ty ty ts = (reverse ts, orig_ty)
661 tcSplitSigmaTy :: Type -> ([TyVar], ThetaType, Type)
662 tcSplitSigmaTy ty = case tcSplitForAllTys ty of
663 (tvs, rho) -> case tcSplitPhiTy rho of
664 (theta, tau) -> (tvs, theta, tau)
666 -----------------------
669 -> ( [([TyVar], ThetaType)], -- forall as.C => forall bs.D
670 TcSigmaType) -- The rest of the type
672 -- We need a loop here because we are now prepared to entertain
674 -- f:: forall a. Eq a => forall b. Baz b => tau
675 -- We want to instantiate this to
676 -- f2::tau {f2 = f1 b (Baz b), f1 = f a (Eq a)}
678 tcMultiSplitSigmaTy sigma
679 = case (tcSplitSigmaTy sigma) of
680 ([],[],ty) -> ([], sigma)
681 (tvs, theta, ty) -> case tcMultiSplitSigmaTy ty of
682 (pairs, rest) -> ((tvs,theta):pairs, rest)
684 -----------------------
685 tcTyConAppTyCon :: Type -> TyCon
686 tcTyConAppTyCon ty = case tcSplitTyConApp_maybe ty of
688 Nothing -> pprPanic "tcTyConAppTyCon" (pprType ty)
690 tcTyConAppArgs :: Type -> [Type]
691 tcTyConAppArgs ty = case tcSplitTyConApp_maybe ty of
692 Just (_, args) -> args
693 Nothing -> pprPanic "tcTyConAppArgs" (pprType ty)
695 tcSplitTyConApp :: Type -> (TyCon, [Type])
696 tcSplitTyConApp ty = case tcSplitTyConApp_maybe ty of
698 Nothing -> pprPanic "tcSplitTyConApp" (pprType ty)
700 tcSplitTyConApp_maybe :: Type -> Maybe (TyCon, [Type])
701 tcSplitTyConApp_maybe ty | Just ty' <- tcView ty = tcSplitTyConApp_maybe ty'
702 tcSplitTyConApp_maybe (TyConApp tc tys) = Just (tc, tys)
703 tcSplitTyConApp_maybe (FunTy arg res) = Just (funTyCon, [arg,res])
704 -- Newtypes are opaque, so they may be split
705 -- However, predicates are not treated
706 -- as tycon applications by the type checker
707 tcSplitTyConApp_maybe other = Nothing
709 -----------------------
710 tcSplitFunTys :: Type -> ([Type], Type)
711 tcSplitFunTys ty = case tcSplitFunTy_maybe ty of
713 Just (arg,res) -> (arg:args, res')
715 (args,res') = tcSplitFunTys res
717 tcSplitFunTy_maybe :: Type -> Maybe (Type, Type)
718 tcSplitFunTy_maybe ty | Just ty' <- tcView ty = tcSplitFunTy_maybe ty'
719 tcSplitFunTy_maybe (FunTy arg res) = Just (arg, res)
720 tcSplitFunTy_maybe other = Nothing
724 -> Arity -- N: Number of desired args
725 -> ([TcSigmaType], -- Arg types (N or fewer)
726 TcSigmaType) -- The rest of the type
728 tcSplitFunTysN ty n_args
731 | Just (arg,res) <- tcSplitFunTy_maybe ty
732 = case tcSplitFunTysN res (n_args - 1) of
733 (args, res) -> (arg:args, res)
737 tcSplitFunTy ty = expectJust "tcSplitFunTy" (tcSplitFunTy_maybe ty)
738 tcFunArgTy ty = fst (tcSplitFunTy ty)
739 tcFunResultTy ty = snd (tcSplitFunTy ty)
741 -----------------------
742 tcSplitAppTy_maybe :: Type -> Maybe (Type, Type)
743 tcSplitAppTy_maybe ty | Just ty' <- tcView ty = tcSplitAppTy_maybe ty'
744 tcSplitAppTy_maybe ty = repSplitAppTy_maybe ty
746 tcSplitAppTy :: Type -> (Type, Type)
747 tcSplitAppTy ty = case tcSplitAppTy_maybe ty of
749 Nothing -> pprPanic "tcSplitAppTy" (pprType ty)
751 tcSplitAppTys :: Type -> (Type, [Type])
755 go ty args = case tcSplitAppTy_maybe ty of
756 Just (ty', arg) -> go ty' (arg:args)
759 -----------------------
760 tcGetTyVar_maybe :: Type -> Maybe TyVar
761 tcGetTyVar_maybe ty | Just ty' <- tcView ty = tcGetTyVar_maybe ty'
762 tcGetTyVar_maybe (TyVarTy tv) = Just tv
763 tcGetTyVar_maybe other = Nothing
765 tcGetTyVar :: String -> Type -> TyVar
766 tcGetTyVar msg ty = expectJust msg (tcGetTyVar_maybe ty)
768 tcIsTyVarTy :: Type -> Bool
769 tcIsTyVarTy ty = maybeToBool (tcGetTyVar_maybe ty)
771 -----------------------
772 tcSplitDFunTy :: Type -> ([TyVar], [PredType], Class, [Type])
773 -- Split the type of a dictionary function
775 = case tcSplitSigmaTy ty of { (tvs, theta, tau) ->
776 case tcSplitDFunHead tau of { (clas, tys) ->
777 (tvs, theta, clas, tys) }}
779 tcSplitDFunHead :: Type -> (Class, [Type])
781 = case tcSplitPredTy_maybe tau of
782 Just (ClassP clas tys) -> (clas, tys)
783 other -> panic "tcSplitDFunHead"
785 tcValidInstHeadTy :: Type -> Bool
786 -- Used in Haskell-98 mode, for the argument types of an instance head
787 -- These must not be type synonyms, but everywhere else type synonyms
788 -- are transparent, so we need a special function here
791 NoteTy _ ty -> tcValidInstHeadTy ty
792 TyConApp tc tys -> not (isSynTyCon tc) && ok tys
793 FunTy arg res -> ok [arg, res]
796 -- Check that all the types are type variables,
797 -- and that each is distinct
798 ok tys = equalLength tvs tys && hasNoDups tvs
800 tvs = mapCatMaybes get_tv tys
802 get_tv (NoteTy _ ty) = get_tv ty -- Again, do not look
803 get_tv (TyVarTy tv) = Just tv -- through synonyms
804 get_tv other = Nothing
809 %************************************************************************
811 \subsection{Predicate types}
813 %************************************************************************
816 tcSplitPredTy_maybe :: Type -> Maybe PredType
817 -- Returns Just for predicates only
818 tcSplitPredTy_maybe ty | Just ty' <- tcView ty = tcSplitPredTy_maybe ty'
819 tcSplitPredTy_maybe (PredTy p) = Just p
820 tcSplitPredTy_maybe other = Nothing
822 predTyUnique :: PredType -> Unique
823 predTyUnique (IParam n _) = getUnique (ipNameName n)
824 predTyUnique (ClassP clas tys) = getUnique clas
828 --------------------- Dictionary types ---------------------------------
831 mkClassPred clas tys = ClassP clas tys
833 isClassPred :: PredType -> Bool
834 isClassPred (ClassP clas tys) = True
835 isClassPred other = False
837 isTyVarClassPred (ClassP clas tys) = all tcIsTyVarTy tys
838 isTyVarClassPred other = False
840 getClassPredTys_maybe :: PredType -> Maybe (Class, [Type])
841 getClassPredTys_maybe (ClassP clas tys) = Just (clas, tys)
842 getClassPredTys_maybe _ = Nothing
844 getClassPredTys :: PredType -> (Class, [Type])
845 getClassPredTys (ClassP clas tys) = (clas, tys)
846 getClassPredTys other = panic "getClassPredTys"
848 mkDictTy :: Class -> [Type] -> Type
849 mkDictTy clas tys = mkPredTy (ClassP clas tys)
851 isDictTy :: Type -> Bool
852 isDictTy ty | Just ty' <- tcView ty = isDictTy ty'
853 isDictTy (PredTy p) = isClassPred p
854 isDictTy other = False
857 --------------------- Implicit parameters ---------------------------------
860 isIPPred :: PredType -> Bool
861 isIPPred (IParam _ _) = True
862 isIPPred other = False
864 isInheritablePred :: PredType -> Bool
865 -- Can be inherited by a context. For example, consider
866 -- f x = let g y = (?v, y+x)
867 -- in (g 3 with ?v = 8,
869 -- The point is that g's type must be quantifed over ?v:
870 -- g :: (?v :: a) => a -> a
871 -- but it doesn't need to be quantified over the Num a dictionary
872 -- which can be free in g's rhs, and shared by both calls to g
873 isInheritablePred (ClassP _ _) = True
874 isInheritablePred (EqPred _ _) = True
875 isInheritablePred other = False
878 --------------------- Equality predicates ---------------------------------
880 substEqSpec :: TvSubst -> [(TyVar,Type)] -> [(TcType,TcType)]
881 substEqSpec subst eq_spec = [ (substTyVar subst tv, substTy subst ty)
882 | (tv,ty) <- eq_spec]
885 --------------------- The stupid theta (sigh) ---------------------------------
888 dataConsStupidTheta :: [DataCon] -> ThetaType
889 -- Union the stupid thetas from all the specified constructors (non-empty)
890 -- All the constructors should have the same result type, modulo alpha conversion
891 -- The resulting ThetaType uses type variables from the *first* constructor in the list
893 -- It's here because it's used in MkId.mkRecordSelId, and in TcExpr
894 dataConsStupidTheta (con1:cons)
895 = nubBy tcEqPred all_preds
897 all_preds = dataConStupidTheta con1 ++ other_stupids
898 res_ty1 = dataConOrigResTy con1
899 other_stupids = [ substPred subst pred
901 , let (tvs, _, _, res_ty) = dataConSig con
902 Just subst = tcMatchTy (mkVarSet tvs) res_ty res_ty1
903 , pred <- dataConStupidTheta con ]
904 dataConsStupidTheta [] = panic "dataConsStupidTheta"
908 %************************************************************************
910 \subsection{Predicates}
912 %************************************************************************
914 isSigmaTy returns true of any qualified type. It doesn't *necessarily* have
916 f :: (?x::Int) => Int -> Int
919 isSigmaTy :: Type -> Bool
920 isSigmaTy ty | Just ty' <- tcView ty = isSigmaTy ty'
921 isSigmaTy (ForAllTy tyvar ty) = True
922 isSigmaTy (FunTy a b) = isPredTy a
925 isOverloadedTy :: Type -> Bool
926 isOverloadedTy ty | Just ty' <- tcView ty = isOverloadedTy ty'
927 isOverloadedTy (ForAllTy tyvar ty) = isOverloadedTy ty
928 isOverloadedTy (FunTy a b) = isPredTy a
929 isOverloadedTy _ = False
931 isPredTy :: Type -> Bool -- Belongs in TcType because it does
932 -- not look through newtypes, or predtypes (of course)
933 isPredTy ty | Just ty' <- tcView ty = isPredTy ty'
934 isPredTy (PredTy sty) = True
939 isFloatTy = is_tc floatTyConKey
940 isDoubleTy = is_tc doubleTyConKey
941 isIntegerTy = is_tc integerTyConKey
942 isIntTy = is_tc intTyConKey
943 isBoolTy = is_tc boolTyConKey
944 isUnitTy = is_tc unitTyConKey
945 isCharTy = is_tc charTyConKey
948 = case tcSplitTyConApp_maybe ty of
949 Just (tc, [arg_ty]) -> tc == listTyCon && isCharTy arg_ty
952 is_tc :: Unique -> Type -> Bool
953 -- Newtypes are opaque to this
954 is_tc uniq ty = case tcSplitTyConApp_maybe ty of
955 Just (tc, _) -> uniq == getUnique tc
960 %************************************************************************
964 %************************************************************************
967 deNoteType :: Type -> Type
968 -- Remove all *outermost* type synonyms and other notes
969 deNoteType ty | Just ty' <- tcView ty = deNoteType ty'
974 tcTyVarsOfType :: Type -> TcTyVarSet
975 -- Just the *TcTyVars* free in the type
976 -- (Types.tyVarsOfTypes finds all free TyVars)
977 tcTyVarsOfType (TyVarTy tv) = if isTcTyVar tv then unitVarSet tv
979 tcTyVarsOfType (TyConApp tycon tys) = tcTyVarsOfTypes tys
980 tcTyVarsOfType (NoteTy _ ty) = tcTyVarsOfType ty
981 tcTyVarsOfType (PredTy sty) = tcTyVarsOfPred sty
982 tcTyVarsOfType (FunTy arg res) = tcTyVarsOfType arg `unionVarSet` tcTyVarsOfType res
983 tcTyVarsOfType (AppTy fun arg) = tcTyVarsOfType fun `unionVarSet` tcTyVarsOfType arg
984 tcTyVarsOfType (ForAllTy tyvar ty) = (tcTyVarsOfType ty `delVarSet` tyvar)
985 `unionVarSet` tcTyVarsOfTyVar tyvar
986 -- We do sometimes quantify over skolem TcTyVars
988 tcTyVarsOfTyVar :: TcTyVar -> TyVarSet
989 tcTyVarsOfTyVar tv | isCoVar tv = tcTyVarsOfType (tyVarKind tv)
990 | otherwise = emptyVarSet
992 tcTyVarsOfTypes :: [Type] -> TyVarSet
993 tcTyVarsOfTypes tys = foldr (unionVarSet.tcTyVarsOfType) emptyVarSet tys
995 tcTyVarsOfPred :: PredType -> TyVarSet
996 tcTyVarsOfPred (IParam _ ty) = tcTyVarsOfType ty
997 tcTyVarsOfPred (ClassP _ tys) = tcTyVarsOfTypes tys
998 tcTyVarsOfPred (EqPred ty1 ty2) = tcTyVarsOfType ty1 `unionVarSet` tcTyVarsOfType ty2
1001 Note [Silly type synonym]
1002 ~~~~~~~~~~~~~~~~~~~~~~~~~
1005 What are the free tyvars of (T x)? Empty, of course!
1006 Here's the example that Ralf Laemmel showed me:
1007 foo :: (forall a. C u a -> C u a) -> u
1008 mappend :: Monoid u => u -> u -> u
1010 bar :: Monoid u => u
1011 bar = foo (\t -> t `mappend` t)
1012 We have to generalise at the arg to f, and we don't
1013 want to capture the constraint (Monad (C u a)) because
1014 it appears to mention a. Pretty silly, but it was useful to him.
1016 exactTyVarsOfType is used by the type checker to figure out exactly
1017 which type variables are mentioned in a type. It's also used in the
1018 smart-app checking code --- see TcExpr.tcIdApp
1021 exactTyVarsOfType :: TcType -> TyVarSet
1022 -- Find the free type variables (of any kind)
1023 -- but *expand* type synonyms. See Note [Silly type synonym] above.
1024 exactTyVarsOfType ty
1027 go ty | Just ty' <- tcView ty = go ty' -- This is the key line
1028 go (TyVarTy tv) = unitVarSet tv
1029 go (TyConApp tycon tys) = exactTyVarsOfTypes tys
1030 go (PredTy ty) = go_pred ty
1031 go (FunTy arg res) = go arg `unionVarSet` go res
1032 go (AppTy fun arg) = go fun `unionVarSet` go arg
1033 go (ForAllTy tyvar ty) = delVarSet (go ty) tyvar
1034 `unionVarSet` go_tv tyvar
1036 go_pred (IParam _ ty) = go ty
1037 go_pred (ClassP _ tys) = exactTyVarsOfTypes tys
1038 go_pred (EqPred ty1 ty2) = go ty1 `unionVarSet` go ty2
1040 go_tv tyvar | isCoVar tyvar = go (tyVarKind tyvar)
1041 | otherwise = emptyVarSet
1043 exactTyVarsOfTypes :: [TcType] -> TyVarSet
1044 exactTyVarsOfTypes tys = foldr (unionVarSet . exactTyVarsOfType) emptyVarSet tys
1047 Find the free tycons and classes of a type. This is used in the front
1048 end of the compiler.
1051 tyClsNamesOfType :: Type -> NameSet
1052 tyClsNamesOfType (TyVarTy tv) = emptyNameSet
1053 tyClsNamesOfType (TyConApp tycon tys) = unitNameSet (getName tycon) `unionNameSets` tyClsNamesOfTypes tys
1054 tyClsNamesOfType (NoteTy _ ty2) = tyClsNamesOfType ty2
1055 tyClsNamesOfType (PredTy (IParam n ty)) = tyClsNamesOfType ty
1056 tyClsNamesOfType (PredTy (ClassP cl tys)) = unitNameSet (getName cl) `unionNameSets` tyClsNamesOfTypes tys
1057 tyClsNamesOfType (PredTy (EqPred ty1 ty2)) = tyClsNamesOfType ty1 `unionNameSets` tyClsNamesOfType ty2
1058 tyClsNamesOfType (FunTy arg res) = tyClsNamesOfType arg `unionNameSets` tyClsNamesOfType res
1059 tyClsNamesOfType (AppTy fun arg) = tyClsNamesOfType fun `unionNameSets` tyClsNamesOfType arg
1060 tyClsNamesOfType (ForAllTy tyvar ty) = tyClsNamesOfType ty
1062 tyClsNamesOfTypes tys = foldr (unionNameSets . tyClsNamesOfType) emptyNameSet tys
1064 tyClsNamesOfDFunHead :: Type -> NameSet
1065 -- Find the free type constructors and classes
1066 -- of the head of the dfun instance type
1067 -- The 'dfun_head_type' is because of
1068 -- instance Foo a => Baz T where ...
1069 -- The decl is an orphan if Baz and T are both not locally defined,
1070 -- even if Foo *is* locally defined
1071 tyClsNamesOfDFunHead dfun_ty
1072 = case tcSplitSigmaTy dfun_ty of
1073 (tvs,_,head_ty) -> tyClsNamesOfType head_ty
1077 %************************************************************************
1079 \subsection[TysWiredIn-ext-type]{External types}
1081 %************************************************************************
1083 The compiler's foreign function interface supports the passing of a
1084 restricted set of types as arguments and results (the restricting factor
1088 tcSplitIOType_maybe :: Type -> Maybe (TyCon, Type)
1089 -- (isIOType t) returns (Just (IO,t')) if t is of the form (IO t'), or
1090 -- some newtype wrapping thereof
1091 -- returns Nothing otherwise
1092 tcSplitIOType_maybe ty
1093 | Just (io_tycon, [io_res_ty]) <- tcSplitTyConApp_maybe ty,
1094 -- This split absolutely has to be a tcSplit, because we must
1095 -- see the IO type; and it's a newtype which is transparent to splitTyConApp.
1096 io_tycon `hasKey` ioTyConKey
1097 = Just (io_tycon, io_res_ty)
1099 | Just ty' <- coreView ty -- Look through non-recursive newtypes
1100 = tcSplitIOType_maybe ty'
1105 isFFITy :: Type -> Bool
1106 -- True for any TyCon that can possibly be an arg or result of an FFI call
1107 isFFITy ty = checkRepTyCon legalFFITyCon ty
1109 isFFIArgumentTy :: DynFlags -> Safety -> Type -> Bool
1110 -- Checks for valid argument type for a 'foreign import'
1111 isFFIArgumentTy dflags safety ty
1112 = checkRepTyCon (legalOutgoingTyCon dflags safety) ty
1114 isFFIExternalTy :: Type -> Bool
1115 -- Types that are allowed as arguments of a 'foreign export'
1116 isFFIExternalTy ty = checkRepTyCon legalFEArgTyCon ty
1118 isFFIImportResultTy :: DynFlags -> Type -> Bool
1119 isFFIImportResultTy dflags ty
1120 = checkRepTyCon (legalFIResultTyCon dflags) ty
1122 isFFIExportResultTy :: Type -> Bool
1123 isFFIExportResultTy ty = checkRepTyCon legalFEResultTyCon ty
1125 isFFIDynArgumentTy :: Type -> Bool
1126 -- The argument type of a foreign import dynamic must be Ptr, FunPtr, Addr,
1127 -- or a newtype of either.
1128 isFFIDynArgumentTy = checkRepTyConKey [ptrTyConKey, funPtrTyConKey]
1130 isFFIDynResultTy :: Type -> Bool
1131 -- The result type of a foreign export dynamic must be Ptr, FunPtr, Addr,
1132 -- or a newtype of either.
1133 isFFIDynResultTy = checkRepTyConKey [ptrTyConKey, funPtrTyConKey]
1135 isFFILabelTy :: Type -> Bool
1136 -- The type of a foreign label must be Ptr, FunPtr, Addr,
1137 -- or a newtype of either.
1138 isFFILabelTy = checkRepTyConKey [ptrTyConKey, funPtrTyConKey]
1140 isFFIDotnetTy :: DynFlags -> Type -> Bool
1141 isFFIDotnetTy dflags ty
1142 = checkRepTyCon (\ tc -> (legalFIResultTyCon dflags tc ||
1143 isFFIDotnetObjTy ty || isStringTy ty)) ty
1144 -- NB: isStringTy used to look through newtypes, but
1145 -- it no longer does so. May need to adjust isFFIDotNetTy
1146 -- if we do want to look through newtypes.
1148 isFFIDotnetObjTy ty =
1150 (_, t_ty) = tcSplitForAllTys ty
1152 case tcSplitTyConApp_maybe (repType t_ty) of
1153 Just (tc, [arg_ty]) | getName tc == objectTyConName -> True
1156 toDNType :: Type -> DNType
1158 | isStringTy ty = DNString
1159 | isFFIDotnetObjTy ty = DNObject
1160 | Just (tc,argTys) <- tcSplitTyConApp_maybe ty
1161 = case lookup (getUnique tc) dn_assoc of
1164 | tc `hasKey` ioTyConKey -> toDNType (head argTys)
1165 | otherwise -> pprPanic ("toDNType: unsupported .NET type")
1166 (pprType ty <+> parens (hcat (map pprType argTys)) <+> ppr tc)
1167 | otherwise = panic "toDNType" -- Is this right?
1169 dn_assoc :: [ (Unique, DNType) ]
1170 dn_assoc = [ (unitTyConKey, DNUnit)
1171 , (intTyConKey, DNInt)
1172 , (int8TyConKey, DNInt8)
1173 , (int16TyConKey, DNInt16)
1174 , (int32TyConKey, DNInt32)
1175 , (int64TyConKey, DNInt64)
1176 , (wordTyConKey, DNInt)
1177 , (word8TyConKey, DNWord8)
1178 , (word16TyConKey, DNWord16)
1179 , (word32TyConKey, DNWord32)
1180 , (word64TyConKey, DNWord64)
1181 , (floatTyConKey, DNFloat)
1182 , (doubleTyConKey, DNDouble)
1183 , (ptrTyConKey, DNPtr)
1184 , (funPtrTyConKey, DNPtr)
1185 , (charTyConKey, DNChar)
1186 , (boolTyConKey, DNBool)
1189 checkRepTyCon :: (TyCon -> Bool) -> Type -> Bool
1190 -- Look through newtypes
1191 -- Non-recursive ones are transparent to splitTyConApp,
1192 -- but recursive ones aren't. Manuel had:
1193 -- newtype T = MkT (Ptr T)
1194 -- and wanted it to work...
1195 checkRepTyCon check_tc ty
1196 | Just (tc,_) <- splitTyConApp_maybe (repType ty) = check_tc tc
1199 checkRepTyConKey :: [Unique] -> Type -> Bool
1200 -- Like checkRepTyCon, but just looks at the TyCon key
1201 checkRepTyConKey keys
1202 = checkRepTyCon (\tc -> tyConUnique tc `elem` keys)
1205 ----------------------------------------------
1206 These chaps do the work; they are not exported
1207 ----------------------------------------------
1210 legalFEArgTyCon :: TyCon -> Bool
1212 -- It's illegal to make foreign exports that take unboxed
1213 -- arguments. The RTS API currently can't invoke such things. --SDM 7/2000
1214 = boxedMarshalableTyCon tc
1216 legalFIResultTyCon :: DynFlags -> TyCon -> Bool
1217 legalFIResultTyCon dflags tc
1218 | tc == unitTyCon = True
1219 | otherwise = marshalableTyCon dflags tc
1221 legalFEResultTyCon :: TyCon -> Bool
1222 legalFEResultTyCon tc
1223 | tc == unitTyCon = True
1224 | otherwise = boxedMarshalableTyCon tc
1226 legalOutgoingTyCon :: DynFlags -> Safety -> TyCon -> Bool
1227 -- Checks validity of types going from Haskell -> external world
1228 legalOutgoingTyCon dflags safety tc
1229 = marshalableTyCon dflags tc
1231 legalFFITyCon :: TyCon -> Bool
1232 -- True for any TyCon that can possibly be an arg or result of an FFI call
1234 = isUnLiftedTyCon tc || boxedMarshalableTyCon tc || tc == unitTyCon
1236 marshalableTyCon dflags tc
1237 = (dopt Opt_GlasgowExts dflags && isUnLiftedTyCon tc)
1238 || boxedMarshalableTyCon tc
1240 boxedMarshalableTyCon tc
1241 = getUnique tc `elem` [ intTyConKey, int8TyConKey, int16TyConKey
1242 , int32TyConKey, int64TyConKey
1243 , wordTyConKey, word8TyConKey, word16TyConKey
1244 , word32TyConKey, word64TyConKey
1245 , floatTyConKey, doubleTyConKey
1246 , ptrTyConKey, funPtrTyConKey