2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
4 \section[Class]{The @Class@ datatype}
7 #include "HsVersions.h"
10 GenClass(..), SYN_IE(Class),
13 classKey, classOps, classSelIds,
14 classSuperDictSelId, classOpId, classDefaultMethodId,
15 classSig, classBigSig, classInstEnv,
19 derivableClassKeys, needsDataDeclCtxtClassKeys,
20 cCallishClassKeys, isNoDictClass,
21 isNumericClass, isStandardClass, isCcallishClass,
23 GenClassOp(..), SYN_IE(ClassOp),
25 classOpTag, classOpString,
31 CHK_Ubiq() -- debugging consistency check
33 IMPORT_DELOOPER(TyLoop)
35 import TyCon ( TyCon )
36 import TyVar ( SYN_IE(TyVar), GenTyVar )
37 import Usage ( GenUsage, SYN_IE(Usage), SYN_IE(UVar) )
39 import MatchEnv ( MatchEnv )
40 import Maybes ( assocMaybe )
41 import Name ( changeUnique, Name )
42 import Unique -- Keys for built-in classes
43 import Pretty ( SYN_IE(Pretty), ppCat, ppPStr )
44 --import PprStyle ( PprStyle )
45 import SrcLoc ( SrcLoc )
49 %************************************************************************
51 \subsection[Class-basic]{@Class@: basic definition}
53 %************************************************************************
55 A @Class@ corresponds to a Greek kappa in the static semantics:
57 The parameterisation wrt tyvar and uvar is only necessary to
58 get appropriately general instances of Ord3 for GenType.
62 = ClassOp FAST_STRING -- The operation name
64 Int -- Unique within a class; starts at 1
66 ty -- Type; the class tyvar is free (you can find
67 -- it from the class). This means that a
68 -- ClassOp doesn't make much sense outside the
69 -- context of its parent class.
71 data GenClass tyvar uvar
73 Unique -- Key for fast comparison
76 tyvar -- The class type variable
78 [GenClass tyvar uvar] -- Immediate superclasses, and the
79 [Id] -- corresponding selector functions to
80 -- extract them from a dictionary of this
83 [GenClassOp (GenType tyvar uvar)] -- The * class operations
84 [Id] -- * selector functions
85 [Id] -- * default methods
86 -- They are all ordered by tag. The
87 -- selector ids are less innocent than they
88 -- look, because their IdInfos contains
89 -- suitable specialisation information. In
90 -- particular, constant methods are
91 -- instances of selectors at suitably simple
94 ClassInstEnv -- Gives details of all the instances of this class
96 [(GenClass tyvar uvar, [GenClass tyvar uvar])]
97 -- Indirect superclasses;
98 -- (k,[k1,...,kn]) means that
99 -- k is an immediate superclass of k1
100 -- k1 is an immediate superclass of k2
101 -- ... and kn is an immediate superclass
102 -- of this class. (This is all redundant
103 -- information, since it can be derived from
104 -- the superclass information above.)
106 type Class = GenClass TyVar UVar
107 type ClassOp = GenClassOp Type
109 type ClassInstEnv = MatchEnv Type Id -- The Ids are dfuns
112 The @mkClass@ function fills in the indirect superclasses.
115 mkClass :: Unique -> Name -> TyVar
117 -> [ClassOp] -> [Id] -> [Id]
121 mkClass uniq full_name tyvar super_classes superdict_sels
122 class_ops dict_sels defms class_insts
123 = Class uniq (changeUnique full_name uniq) tyvar
124 super_classes superdict_sels
125 class_ops dict_sels defms
129 trans_clos :: [(Class,[Class])]
130 trans_clos = transitiveClosure succ (==) [ (clas, []) | clas <- super_classes ]
132 succ (clas@(Class _ _ _ super_classes _ _ _ _ _ _), links)
133 = [(super, (clas:links)) | super <- super_classes]
136 %************************************************************************
138 \subsection[Class-selectors]{@Class@: simple selectors}
140 %************************************************************************
142 The rest of these functions are just simple selectors.
145 classKey (Class key _ _ _ _ _ _ _ _ _) = key
146 classOps (Class _ _ _ _ _ ops _ _ _ _) = ops
147 classSelIds (Class _ _ _ _ _ _ sels _ _ _) = sels
149 classOpId (Class _ _ _ _ _ ops op_ids _ _ _) op
150 = op_ids !! (classOpTag op - 1)
151 classDefaultMethodId (Class _ _ _ _ _ ops _ defm_ids _ _) op
152 = defm_ids !! (classOpTag op - 1)
153 classSuperDictSelId (Class _ _ _ scs scsel_ids _ _ _ _ _) super_clas
154 = assoc "classSuperDictSelId" (scs `zip` scsel_ids) super_clas
156 classSig :: GenClass t u -> (t, [GenClass t u], [GenClassOp (GenType t u)])
157 classSig (Class _ _ tyvar super_classes _ ops _ _ _ _)
158 = (tyvar, super_classes, ops)
160 classBigSig (Class _ _ tyvar super_classes sdsels ops sels defms _ _)
161 = (tyvar, super_classes, sdsels, ops, sels, defms)
163 classInstEnv (Class _ _ _ _ _ _ _ _ inst_env _) = inst_env
166 @a `isSuperClassOf` b@ returns @Nothing@ if @a@ is not a superclass of
167 @b@, but if it is, it returns $@Just@~[k_1,\ldots,k_n]$, where the
168 $k_1,\ldots,k_n$ are exactly as described in the definition of the
169 @GenClass@ constructor above.
172 isSuperClassOf :: Class -> Class -> Maybe [Class]
173 clas `isSuperClassOf` (Class _ _ _ _ _ _ _ _ _ links) = assocMaybe links clas
176 %************************************************************************
178 \subsection[Class-std-groups]{Standard groups of Prelude classes}
180 %************************************************************************
182 @derivableClassKeys@ is also used in checking \tr{deriving} constructs
185 NOTE: @Eq@ and @Text@ do need to appear in @standardClasses@
186 even though every numeric class has these two as a superclass,
187 because the list of ambiguous dictionaries hasn't been simplified.
190 isNumericClass, isStandardClass :: Class -> Bool
192 isNumericClass (Class key _ _ _ _ _ _ _ _ _) = --pprTrace "isNum:" (ppCat (map pprUnique (key : numericClassKeys ))) $
193 key `is_elem` numericClassKeys
194 isStandardClass (Class key _ _ _ _ _ _ _ _ _) = key `is_elem` standardClassKeys
195 isCcallishClass (Class key _ _ _ _ _ _ _ _ _) = key `is_elem` cCallishClassKeys
196 isNoDictClass (Class key _ _ _ _ _ _ _ _ _) = key `is_elem` noDictClassKeys
197 is_elem = isIn "is_X_Class"
220 needsDataDeclCtxtClassKeys -- see comments in TcDeriv
224 cCallishClassKeys = [ cCallableClassKey, cReturnableClassKey ]
227 = derivableClassKeys ++ numericClassKeys ++ cCallishClassKeys
229 -- We have to have "CCallable" and "CReturnable" in the standard
230 -- classes, so that if you go...
232 -- _ccall_ foo ... 93{-numeric literal-} ...
234 -- ... it can do The Right Thing on the 93.
236 noDictClassKeys -- These classes are used only for type annotations;
237 -- they are not implemented by dictionaries, ever.
239 -- I used to think that class Eval belonged in here, but
240 -- we really want functions with type (Eval a => ...) and that
241 -- means that we really want to pass a placeholder for an Eval
242 -- dictionary. The unit tuple is what we'll get if we leave things
243 -- alone, and that'll do for now. Could arrange to drop that parameter
247 %************************************************************************
249 \subsection[Class-instances]{Instance declarations for @Class@}
251 %************************************************************************
253 We compare @Classes@ by their keys (which include @Uniques@).
256 instance Ord3 (GenClass tyvar uvar) where
257 cmp (Class k1 _ _ _ _ _ _ _ _ _) (Class k2 _ _ _ _ _ _ _ _ _) = cmp k1 k2
259 instance Eq (GenClass tyvar uvar) where
260 (Class k1 _ _ _ _ _ _ _ _ _) == (Class k2 _ _ _ _ _ _ _ _ _) = k1 == k2
261 (Class k1 _ _ _ _ _ _ _ _ _) /= (Class k2 _ _ _ _ _ _ _ _ _) = k1 /= k2
263 instance Ord (GenClass tyvar uvar) where
264 (Class k1 _ _ _ _ _ _ _ _ _) <= (Class k2 _ _ _ _ _ _ _ _ _) = k1 <= k2
265 (Class k1 _ _ _ _ _ _ _ _ _) < (Class k2 _ _ _ _ _ _ _ _ _) = k1 < k2
266 (Class k1 _ _ _ _ _ _ _ _ _) >= (Class k2 _ _ _ _ _ _ _ _ _) = k1 >= k2
267 (Class k1 _ _ _ _ _ _ _ _ _) > (Class k2 _ _ _ _ _ _ _ _ _) = k1 > k2
268 _tagCmp a b = case cmp a b of { LT_ -> _LT; EQ_ -> _EQ; GT__ -> _GT }
272 instance Uniquable (GenClass tyvar uvar) where
273 uniqueOf (Class u _ _ _ _ _ _ _ _ _) = u
275 instance NamedThing (GenClass tyvar uvar) where
276 getName (Class _ n _ _ _ _ _ _ _ _) = n
280 %************************************************************************
282 \subsection[ClassOp-basic]{@ClassOp@: type and basic functions}
284 %************************************************************************
286 A @ClassOp@ represents a a class operation. From it and its parent
287 class we can construct the dictionary-selector @Id@ for the
288 operation/superclass dictionary, and the @Id@ for its default method.
289 It appears in a list inside the @Class@ object.
291 The type of a method in a @ClassOp@ object is its local type; that is,
292 without the overloading of the class itself. For example, in the
296 op :: Ord b => a -> b -> a
298 the type recorded for @op@ in the @ClassOp@ list of the @Class@ object is
301 @Ord@~\beta \Rightarrow
302 \alpha \rightarrow \beta \rightarrow alpha$
304 (where $\alpha$ is the class type variable recorded in the @Class@
305 object). Of course, the type of @op@ recorded in the GVE will be its
308 $\forall \alpha \forall \beta.~
309 @Foo@~\alpha \Rightarrow
310 ~@Ord@~\beta \Rightarrow \alpha
311 \rightarrow \beta \rightarrow alpha$
313 ******************************************************************
314 **** That is, the type variables of a class op selector
315 *** are all at the outer level.
316 ******************************************************************
319 mkClassOp :: FAST_STRING -> Int -> ty -> GenClassOp ty
320 mkClassOp name tag ty = ClassOp name tag ty
322 classOpTag :: GenClassOp ty -> Int
323 classOpTag (ClassOp _ tag _) = tag
325 classOpString :: GenClassOp ty -> FAST_STRING
326 classOpString (ClassOp str _ _) = str
328 classOpLocalType :: GenClassOp ty -> ty {-SigmaType-}
329 classOpLocalType (ClassOp _ _ ty) = ty
332 Rather unsavoury ways of getting ClassOp tags:
334 classOpTagByString :: Class -> FAST_STRING -> Int
336 classOpTagByString clas op
337 = go (map classOpString (classOps clas)) 1
339 go (n:ns) tag = if n == op
343 go [] tag = pprPanic "classOpTagByString:" (ppCat (ppPStr op : map (ppPStr . classOpString) (classOps clas)))
347 %************************************************************************
349 \subsection[ClassOp-instances]{Instance declarations for @ClassOp@}
351 %************************************************************************
353 @ClassOps@ are compared by their tags.
356 instance Eq (GenClassOp ty) where
357 (ClassOp _ i1 _) == (ClassOp _ i2 _) = i1 == i2
358 (ClassOp _ i1 _) /= (ClassOp _ i2 _) = i1 == i2
360 instance Ord (GenClassOp ty) where
361 (ClassOp _ i1 _) <= (ClassOp _ i2 _) = i1 <= i2
362 (ClassOp _ i1 _) < (ClassOp _ i2 _) = i1 < i2
363 (ClassOp _ i1 _) >= (ClassOp _ i2 _) = i1 >= i2
364 (ClassOp _ i1 _) > (ClassOp _ i2 _) = i1 > i2
365 -- ToDo: something for _tagCmp? (WDP 94/10)