2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1995
4 \section[TyVar]{Type variables}
7 #include "HsVersions.h"
10 TyVar(..), -- non-abstract for unifier's benefit
13 mkUserTyVar, mkPolySysTyVar, mkOpenSysTyVar,
14 --UNUSED: mkPrimSysTyVar, isPrimTyVar,
18 cmpTyVar, eqTyVar, ltTyVar, -- used a lot!
20 mkUserTyVarTemplate, mkSysTyVarTemplate, mkTemplateTyVars,
22 cloneTyVarFromTemplate,
24 instantiateTyVarTemplates,
26 -- a supply of template tyvars
28 alpha_tv, beta_tv, gamma_tv, delta_tv, epsilon_tv, -- templates
29 alpha_tyvar, beta_tyvar, gamma_tyvar, delta_tyvar, epsilon_tyvar,-- real tyvars
31 -- so the module is self-contained...
35 import NameTypes ( ShortName )
36 import Outputable -- class for printing, forcing
37 import Pretty -- pretty-printing utilities
38 import SrcLoc ( SrcLoc, mkUnknownSrcLoc )
40 import UniType ( mkTyVarTy, TauType(..), InstTyEnv(..), UniType
41 IF_ATTACK_PRAGMAS(COMMA cmpUniType)
45 #ifndef __GLASGOW_HASKELL__
46 {-hide import from mkdependHS-}
52 %************************************************************************
54 \subsection[TyVar-basics]{@TyVar@ type and basic operations}
56 %************************************************************************
58 We distinguish system from user type variables so that the unifier can
59 bias in terms of replacing system with user ones rather than vice
64 = PrimSysTyVar -- Can only be unified with a primitive type
65 Unique -- Cannot be generalised
66 -- Introduced by ccalls
68 | PolySysTyVar -- Can only be unified with a boxed type
69 Unique -- Can be generalised
70 -- Introduced when a polymorphic type is instantiated
72 | OpenSysTyVar -- Can unify with any type at all
73 Unique -- Can be generalised, but remember that the resulting
74 -- polymorphic type will be instantiated with PolySysTyVars
75 -- Introduced by lambda bindings
77 | UserTyVar -- This is exactly like PolySysTyVar except that it
78 Unique -- has a name attached, derived from something the user typed
81 -- **** NB: Unboxed but non-primitive things (which don't exist at all at present)
82 -- are not catered for by the above scheme.
84 mkPolySysTyVar = PolySysTyVar
85 mkUserTyVar = UserTyVar
86 mkOpenSysTyVar = OpenSysTyVar
87 --UNUSED:mkPrimSysTyVar = PrimSysTyVar
90 isPrimTyVar (PrimSysTyVar _) = True
91 isPrimTyVar other = False
94 -- Make a tyvar from a template, given also a unique
95 cloneTyVarFromTemplate :: TyVarTemplate -> Unique -> TyVar
96 cloneTyVarFromTemplate (SysTyVarTemplate _ _) uniq = PolySysTyVar uniq
97 cloneTyVarFromTemplate (UserTyVarTemplate _ n) uniq = UserTyVar uniq n
99 instantiateTyVarTemplates
102 -> (InstTyEnv, -- Old-to-new assoc list
103 [TyVar], -- New type vars
104 [TauType]) -- New type vars wrapped in a UniTyVar
105 instantiateTyVarTemplates tv_tmpls uniqs
106 = --pprTrace "instTyVarTemplates:" (ppr PprDebug new_tys)
107 (tv_tmpls `zipEqual` new_tys, new_tyvars, new_tys)
109 new_tyvars = zipWith cloneTyVarFromTemplate tv_tmpls uniqs
110 new_tys = map mkTyVarTy new_tyvars
112 getTyVarUnique :: TyVar -> Unique
113 getTyVarUnique (PolySysTyVar u) = u
114 getTyVarUnique (PrimSysTyVar u) = u
115 getTyVarUnique (OpenSysTyVar u) = u
116 getTyVarUnique (UserTyVar u _) = u
119 Make a new TyVar ``just like'' another one, but w/ a new @Unique@.
120 Used when cloning big lambdas. his is only required after
121 typechecking so the @TyVarUnique@ is just a normal @Unique@.
124 cloneTyVar :: TyVar -> Unique -> TyVar
126 cloneTyVar (PolySysTyVar _) uniq = PolySysTyVar uniq
127 cloneTyVar (PrimSysTyVar _) uniq = PrimSysTyVar uniq
128 cloneTyVar (OpenSysTyVar _) uniq = OpenSysTyVar uniq
129 cloneTyVar (UserTyVar _ n) uniq = UserTyVar uniq n
132 %************************************************************************
134 \subsection[TyVar-template]{The @TyVarTemplate@ type}
136 %************************************************************************
138 A @TyVarTemplate@ is a type variable which is used by @UniForall@ to
139 universally quantify a type. It only occurs in a {\em binding}
140 position in a @UniForall@, not (for example) in a @TyLam@ or
141 @AbsBinds@. Every occurrence of a @TyVarTemplate@ in a @UniType@ is
142 bound by an enclosing @UniForall@, with the sole exception that the
143 type in a @ClassOp@ has a free @TyVarTemplate@ which is the class type
144 variable; it is found in the corresponding @Class@ object.
148 = SysTyVarTemplate Unique FAST_STRING
149 | UserTyVarTemplate Unique ShortName
151 mkSysTyVarTemplate = SysTyVarTemplate
152 mkUserTyVarTemplate = UserTyVarTemplate
154 getTyVarTemplateUnique (SysTyVarTemplate u _) = u
155 getTyVarTemplateUnique (UserTyVarTemplate u _) = u
159 alpha_tv, beta_tv, gamma_tv, delta_tv, epsilon_tv :: TyVarTemplate
160 alpha_tv = SysTyVarTemplate (mkBuiltinUnique 1) SLIT("a")
161 beta_tv = SysTyVarTemplate (mkBuiltinUnique 2) SLIT("b")
162 gamma_tv = SysTyVarTemplate (mkBuiltinUnique 3) SLIT("c")
163 delta_tv = SysTyVarTemplate (mkBuiltinUnique 4) SLIT("d")
164 epsilon_tv = SysTyVarTemplate (mkBuiltinUnique 5) SLIT("e")
166 alpha_tyvar, beta_tyvar, gamma_tyvar, delta_tyvar, epsilon_tyvar :: TyVar
167 alpha_tyvar = PolySysTyVar (mkBuiltinUnique 1)
168 beta_tyvar = PolySysTyVar (mkBuiltinUnique 2)
169 gamma_tyvar = PolySysTyVar (mkBuiltinUnique 3)
170 delta_tyvar = PolySysTyVar (mkBuiltinUnique 4)
171 epsilon_tyvar = PolySysTyVar (mkBuiltinUnique 5)
173 -- these are used in tuple magic (see TyCon.lhs and Id.lhs)
174 alphaTyVars :: [TyVarTemplate]
175 alphaTyVars = alphas_from (10::Int) tyVarStrings
177 alphas_from :: Int -> [FAST_STRING] -> [TyVarTemplate]
179 = SysTyVarTemplate (mkBuiltinUnique n) s : (alphas_from (n+1) ss)
181 tyVarStrings :: [FAST_STRING]
183 = letter_strs {- a..y -} ++ number_strs {- z0 ... zN -}
185 letter_strs = [ _PK_ [c] | c <- ['d' .. 'y'] ]
186 number_strs = [ _PK_ ('z': show n) | n <- ([0 .. ] :: [Int]) ]
189 @mkTemplateTyVars@ creates new template type variables, giving them
190 the same name and unique as the type variable given to it. (The name
191 is for documentation purposes; the unique could just as well be
195 mkTemplateTyVars :: [TyVar] -> [TyVarTemplate]
197 mkTemplateTyVars tyvars
198 = zipWith mk_tmpl tyvars tyVarStrings
200 mk_tmpl (UserTyVar u name) str = UserTyVarTemplate u name
201 mk_tmpl (PolySysTyVar u) str = SysTyVarTemplate u str
202 mk_tmpl (OpenSysTyVar u) str = SysTyVarTemplate u str
205 %************************************************************************
207 \subsection[TyVar-instances]{Instance declarations for @TyVar@}
209 %************************************************************************
211 @TyVars@s are compared by comparing their @Unique@s. (Often!)
213 cmpTyVar (PolySysTyVar u1) (PolySysTyVar u2) = u1 `cmpUnique` u2
214 cmpTyVar (PrimSysTyVar u1) (PrimSysTyVar u2) = u1 `cmpUnique` u2
215 cmpTyVar (OpenSysTyVar u1) (OpenSysTyVar u2) = u1 `cmpUnique` u2
216 cmpTyVar (UserTyVar u1 _) (UserTyVar u2 _) = u1 `cmpUnique` u2
217 cmpTyVar other_1 other_2
218 = let tag1 = tag other_1
221 if tag1 _LT_ tag2 then LT_ else GT_
223 tag (PolySysTyVar _) = (ILIT(1) :: FAST_INT)
224 tag (PrimSysTyVar _) = ILIT(2)
225 tag (OpenSysTyVar _) = ILIT(3)
226 tag (UserTyVar _ _) = ILIT(4)
230 eqTyVar a b = case cmpTyVar a b of { EQ_ -> True; _ -> False }
231 ltTyVar a b = case cmpTyVar a b of { LT_ -> True; EQ_ -> False; GT__ -> False }
233 instance Eq TyVar where
234 a == b = case cmpTyVar a b of { EQ_ -> True; _ -> False }
235 a /= b = case cmpTyVar a b of { EQ_ -> False; _ -> True }
237 instance Ord TyVar where
238 a <= b = case cmpTyVar a b of { LT_ -> True; EQ_ -> True; GT__ -> False }
239 a < b = case cmpTyVar a b of { LT_ -> True; EQ_ -> False; GT__ -> False }
240 a >= b = case cmpTyVar a b of { LT_ -> False; EQ_ -> True; GT__ -> True }
241 a > b = case cmpTyVar a b of { LT_ -> False; EQ_ -> False; GT__ -> True }
242 #ifdef __GLASGOW_HASKELL__
243 _tagCmp a b = case cmpTyVar a b of { LT_ -> _LT; EQ_ -> _EQ; GT__ -> _GT }
246 (@Ord@ for @TyVars@ is needed for the @sortLt@ in @TcSimplify@.)
249 instance NamedThing TyVar where
250 getExportFlag tyvar = NotExported
251 isLocallyDefined tyvar = True
253 getOrigName (UserTyVar _ n) = (panic "NamedThing.TyVar.getOrigName(UserTyVar)",
255 getOrigName tyvar = (panic "NamedThing.TyVar.getOrigName(SysTyVar)",
256 _PK_ ('t' : (_UNPK_ (showUnique (getTyVarUnique tyvar)))))
258 getOccurrenceName (UserTyVar _ n) = getOccurrenceName n
259 getOccurrenceName tyvar = _PK_ ('t' : (_UNPK_ (showUnique (getTyVarUnique tyvar))))
261 getInformingModules tyvar = panic "getInformingModule:TyVar"
263 getSrcLoc (UserTyVar _ n) = getSrcLoc n
264 getSrcLoc _ = mkUnknownSrcLoc
266 getTheUnique tyvar = getTyVarUnique tyvar
268 fromPreludeCore _ = False
272 instance Outputable TyVar where
273 ppr sty (PolySysTyVar u) = ppr_tyvar sty (ppChar 't') u
274 ppr sty (PrimSysTyVar u) = ppr_tyvar sty (ppChar 'p') u
275 ppr sty (OpenSysTyVar u) = ppr_tyvar sty (ppChar 'o') u
276 ppr sty (UserTyVar u name) = ppr_tyvar sty (ppr sty name) u
280 --OLD: PprForUser -> name
281 PprDebug -> pprUnique10 u
282 PprUnfolding _ -> pprUnique10 u
283 _ -> ppBesides [name, ppChar '.', pprUnique10 u]
286 %************************************************************************
288 \subsection[TyVarTemplate-instances]{Instance declarations for @TyVarTemplates@}
290 %************************************************************************
293 instance Eq TyVarTemplate where
294 a == b = getTyVarTemplateUnique a == getTyVarTemplateUnique b
295 a /= b = getTyVarTemplateUnique a /= getTyVarTemplateUnique b
299 instance Ord TyVarTemplate where
300 a <= b = getTyVarTemplateUnique a <= getTyVarTemplateUnique b
301 a < b = getTyVarTemplateUnique a < getTyVarTemplateUnique b
302 a >= b = getTyVarTemplateUnique a >= getTyVarTemplateUnique b
303 a > b = getTyVarTemplateUnique a > getTyVarTemplateUnique b
304 #ifdef __GLASGOW_HASKELL__
305 _tagCmp a b = case cmpUnique (getTyVarTemplateUnique a) (getTyVarTemplateUnique b)
306 of { LT_ -> _LT; EQ_ -> _EQ; GT__ -> _GT }
311 instance NamedThing TyVarTemplate where
312 getExportFlag tyvar = NotExported
313 isLocallyDefined tyvar = True
315 getOrigName (UserTyVarTemplate _ n) = (panic "NamedThing.TyVar.getOrigName(UserTyVarTemplate)",
317 getOrigName tyvar = (panic "NamedThing.TyVar.getOrigName(SysTyVarTemplate)",
318 _PK_ ('t' : (_UNPK_ (showUnique (getTyVarTemplateUnique tyvar)))))
320 getOccurrenceName (UserTyVarTemplate _ n) = getOccurrenceName n
321 getOccurrenceName tyvar = _PK_ ('t' : (_UNPK_ (showUnique (getTyVarTemplateUnique tyvar))))
323 getInformingModules tyvar = panic "getInformingModule:TyVarTemplate"
325 getSrcLoc (UserTyVarTemplate _ n) = getSrcLoc n
326 getSrcLoc _ = mkUnknownSrcLoc
328 getTheUnique tyvar = getTyVarTemplateUnique tyvar
330 fromPreludeCore _ = False
334 instance Outputable TyVarTemplate where
335 ppr sty (SysTyVarTemplate u name)
337 --OLD: PprForUser -> ppPStr name
338 _ -> ppBesides [ppPStr name, ppChar '$', pprUnique10 u]
340 ppr sty (UserTyVarTemplate u name)
342 --OLD: PprForUser -> ppr sty name
343 _ -> ppBesides [ppr sty name, ppChar '$', pprUnique10 u]