2 % (c) The GRASP/AQUA Project, Glasgow University, 1998
4 \section[TypeRep]{Type - friends' interface}
8 Type(..), TyNote(..), PredType(..), UsageAnn(..), -- Representation visible to friends
10 Kind, ThetaType, RhoType, TauType, SigmaType, -- Synonyms
13 superKind, superBoxity, -- KX and BX respectively
14 boxedBoxity, unboxedBoxity, -- :: BX
16 typeCon, -- :: BX -> KX
17 boxedTypeKind, unboxedTypeKind, openTypeKind, -- :: KX
18 mkArrowKind, mkArrowKinds, -- :: KX -> KX -> KX
23 #include "HsVersions.h"
26 import Var ( TyVar, UVar )
30 import Name ( Name, Provenance(..), ExportFlag(..),
31 mkWiredInTyConName, mkGlobalName, mkKindOccFS, tcName,
33 import TyCon ( TyCon, KindCon,
34 mkFunTyCon, mkKindCon, mkSuperKindCon,
36 import Class ( Class )
39 import SrcLoc ( mkBuiltinSrcLoc )
40 import PrelNames ( pREL_GHC, kindConKey, boxityConKey, boxedConKey, unboxedConKey,
41 typeConKey, anyBoxConKey, funTyConKey
45 %************************************************************************
47 \subsection{Type Classifications}
49 %************************************************************************
53 *unboxed* iff its representation is other than a pointer
54 Unboxed types cannot instantiate a type variable.
55 Unboxed types are always unlifted.
57 *lifted* A type is lifted iff it has bottom as an element.
58 Closures always have lifted types: i.e. any
59 let-bound identifier in Core must have a lifted
60 type. Operationally, a lifted object is one that
62 (NOTE: previously "pointed").
64 *algebraic* A type with one or more constructors, whether declared
65 with "data" or "newtype".
66 An algebraic type is one that can be deconstructed
67 with a case expression.
68 *NOT* the same as lifted types, because we also
69 include unboxed tuples in this classification.
71 *data* A type declared with "data". Also boxed tuples.
73 *primitive* iff it is a built-in type that can't be expressed
76 Currently, all primitive types are unlifted, but that's not necessarily
77 the case. (E.g. Int could be primitive.)
79 Some primitive types are unboxed, such as Int#, whereas some are boxed
80 but unlifted (such as ByteArray#). The only primitive types that we
81 classify as algebraic are the unboxed tuples.
83 examples of type classifications:
85 Type primitive boxed lifted algebraic
86 -----------------------------------------------------------------------------
88 ByteArray# Yes Yes No No
89 (# a, b #) Yes No No Yes
90 ( a, b ) No Yes Yes Yes
93 %************************************************************************
95 \subsection{The data type}
97 %************************************************************************
101 type SuperKind = Type
104 type TyVarSubst = TyVarEnv Type
110 Type -- Function is *not* a TyConApp
113 | TyConApp -- Application of a TyCon
114 TyCon -- *Invariant* saturated appliations of FunTyCon and
115 -- synonyms have their own constructors, below.
116 [Type] -- Might not be saturated.
118 | FunTy -- Special case of TyConApp: TyConApp FunTyCon [t1,t2]
122 | ForAllTy -- A polymorphic type
126 | PredTy -- A Haskell predicate
129 | NoteTy -- A type with a note attached
131 Type -- The expanded version
134 = SynNote Type -- The unexpanded version of the type synonym; always a TyConApp
135 | FTVNote TyVarSet -- The free type variables of the noted expression
136 | UsgNote UsageAnn -- The usage annotation at this node
137 | UsgForAll UVar -- Annotation variable binder
140 = UsOnce -- Used at most once
141 | UsMany -- Used possibly many times (no info; this annotation can be omitted)
142 | UsVar UVar -- Annotation is variable (unbound OK only inside analysis)
145 type ThetaType = [PredType]
148 type SigmaType = Type
152 -------------------------------------
155 Consider these examples:
156 f :: (Eq a) => a -> Int
157 g :: (?x :: Int -> Int) => a -> Int
158 h :: (r\l) => {r} => {l::Int | r}
160 Here the "Eq a" and "?x :: Int -> Int" and "r\l" are all called *predicates*
161 Predicates are represented inside GHC by PredType:
164 data PredType = Class Class [Type]
168 (We don't support TREX records yet, but the setup is designed
169 to expand to allow them.)
171 A Haskell qualified type, such as that for f,g,h above, is
173 * a FunTy for the double arrow
174 * with a PredTy as the function argument
176 The predicate really does turn into a real extra argument to the
177 function. If the argument has type (PredTy p) then the predicate p is
178 represented by evidence (a dictionary, for example, of type (predRepTy p).
181 %************************************************************************
185 %************************************************************************
189 kind :: KX = kind -> kind
190 | Type boxity -- (Type *) is printed as just *
191 -- (Type #) is printed as just #
193 | OpenKind -- Can be boxed or unboxed
196 | kv -- A kind variable; *only* happens during kind checking
198 boxity :: BX = * -- Boxed
200 | bv -- A boxity variable; *only* happens during kind checking
202 There's a little subtyping at the kind level:
203 forall b. Type b <: OpenKind
205 That is, a type of kind (Type b) is OK in a context requiring an OpenKind
207 OpenKind, written '?', is used as the kind for certain type variables,
210 1. The universally quantified type variable(s) for special built-in
211 things like error :: forall (a::?). String -> a.
212 Here, the 'a' can be instantiated to a boxed or unboxed type.
214 2. Kind '?' is also used when the typechecker needs to create a fresh
215 type variable, one that may very well later be unified with a type.
216 For example, suppose f::a, and we see an application (f x). Then a
217 must be a function type, so we unify a with (b->c). But what kind
218 are b and c? They can be boxed or unboxed types, so we give them kind '?'.
220 When the type checker generalises over a bunch of type variables, it
221 makes any that still have kind '?' into kind '*'. So kind '?' is never
222 present in an inferred type.
226 mk_kind_name key str = mkGlobalName key pREL_GHC (mkKindOccFS tcName str)
227 (LocalDef mkBuiltinSrcLoc NotExported)
228 -- mk_kind_name is a bit of a hack
229 -- The LocalDef means that we print the name without
230 -- a qualifier, which is what we want for these kinds.
231 -- It's used for both Kinds and Boxities
234 ------------------------------------------
235 Define KX, the type of a kind
236 BX, the type of a boxity
239 superKind :: SuperKind -- KX, the type of all kinds
240 superKindName = mk_kind_name kindConKey SLIT("KX")
241 superKind = TyConApp (mkSuperKindCon superKindName) []
243 superBoxity :: SuperKind -- BX, the type of all boxities
244 superBoxityName = mk_kind_name boxityConKey SLIT("BX")
245 superBoxity = TyConApp (mkSuperKindCon superBoxityName) []
248 ------------------------------------------
249 Define boxities: @*@ and @#@
252 boxedBoxity, unboxedBoxity :: Kind -- :: BX
254 boxedConName = mk_kind_name boxedConKey SLIT("*")
255 boxedBoxity = TyConApp (mkKindCon boxedConName superBoxity) []
257 unboxedConName = mk_kind_name unboxedConKey SLIT("#")
258 unboxedBoxity = TyConApp (mkKindCon unboxedConName superBoxity) []
261 ------------------------------------------
262 Define kinds: Type, Type *, Type #, and OpenKind
265 typeCon :: KindCon -- :: BX -> KX
266 typeConName = mk_kind_name typeConKey SLIT("Type")
267 typeCon = mkKindCon typeConName (superBoxity `FunTy` superKind)
269 boxedTypeKind, unboxedTypeKind, openTypeKind :: Kind -- Of superkind superKind
271 boxedTypeKind = TyConApp typeCon [boxedBoxity]
272 unboxedTypeKind = TyConApp typeCon [unboxedBoxity]
274 openKindConName = mk_kind_name anyBoxConKey SLIT("?")
275 openKindCon = mkKindCon openKindConName superKind
276 openTypeKind = TyConApp openKindCon []
279 ------------------------------------------
283 mkArrowKind :: Kind -> Kind -> Kind
284 mkArrowKind k1 k2 = k1 `FunTy` k2
286 mkArrowKinds :: [Kind] -> Kind -> Kind
287 mkArrowKinds arg_kinds result_kind = foldr mkArrowKind result_kind arg_kinds
291 %************************************************************************
293 \subsection{Wired-in type constructors
295 %************************************************************************
297 We define a few wired-in type constructors here to avoid module knots
300 funTyConName = mkWiredInTyConName funTyConKey pREL_GHC SLIT("(->)") funTyCon
301 funTyCon = mkFunTyCon funTyConName (mkArrowKinds [boxedTypeKind, boxedTypeKind] boxedTypeKind)