2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1996
4 \section[Class]{The @Class@ datatype}
11 classKey, classSelIds, classTyCon,
13 classBigSig, classInstEnv,
18 #include "HsVersions.h"
20 import {-# SOURCE #-} Id ( Id )
21 import {-# SOURCE #-} TyCon ( TyCon )
22 import {-# SOURCE #-} Type ( Type )
23 import {-# SOURCE #-} SpecEnv ( SpecEnv )
25 import TyCon ( TyCon )
26 import TyVar ( TyVar )
27 import Name ( NamedThing(..), Name, getOccName )
28 import Unique ( Unique, Uniquable(..) )
29 import BasicTypes ( Unused )
30 import SrcLoc ( SrcLoc )
35 %************************************************************************
37 \subsection[Class-basic]{@Class@: basic definition}
39 %************************************************************************
41 A @Class@ corresponds to a Greek kappa in the static semantics:
46 Unique -- Key for fast comparison
49 [TyVar] -- The class type variables
51 [(Class,[Type])] -- Immediate superclasses, and the
52 [Id] -- corresponding selector functions to
53 -- extract them from a dictionary of this
56 [Id] -- * selector functions
57 [Maybe Id] -- * default methods
58 -- They are all ordered by tag. The
59 -- selector ids contain unfoldings.
61 ClassInstEnv -- All the instances of this class
63 TyCon -- The data type constructor for dictionaries
66 type ClassInstEnv = SpecEnv Id -- The Ids are dfuns
69 The @mkClass@ function fills in the indirect superclasses.
72 mkClass :: Name -> [TyVar]
73 -> [(Class,[Type])] -> [Id]
79 mkClass name tyvars super_classes superdict_sels
80 dict_sels defms tycon class_insts
81 = Class (uniqueOf name) name tyvars
82 super_classes superdict_sels
88 %************************************************************************
90 \subsection[Class-selectors]{@Class@: simple selectors}
92 %************************************************************************
94 The rest of these functions are just simple selectors.
97 classKey (Class key _ _ _ _ _ _ _ _) = key
98 classSuperClassTheta (Class _ _ _ scs _ _ _ _ _) = scs
99 classSelIds (Class _ _ _ _ _ sels _ _ _) = sels
100 classTyCon (Class _ _ _ _ _ _ _ _ tc) = tc
101 classInstEnv (Class _ _ _ _ _ _ _ env _) = env
103 classBigSig (Class _ _ tyvars super_classes sdsels sels defms _ _)
104 = (tyvars, super_classes, sdsels, sels, defms)
108 %************************************************************************
110 \subsection[Class-instances]{Instance declarations for @Class@}
112 %************************************************************************
114 We compare @Classes@ by their keys (which include @Uniques@).
117 instance Eq Class where
118 c1 == c2 = classKey c1 == classKey c2
119 c1 /= c2 = classKey c1 /= classKey c2
121 instance Ord Class where
122 c1 <= c2 = classKey c1 <= classKey c2
123 c1 < c2 = classKey c1 < classKey c2
124 c1 >= c2 = classKey c1 >= classKey c2
125 c1 > c2 = classKey c1 > classKey c2
126 compare c1 c2 = classKey c1 `compare` classKey c2
130 instance Uniquable Class where
131 uniqueOf c = classKey c
133 instance NamedThing Class where
134 getName (Class _ n _ _ _ _ _ _ _) = n