2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section[Class]{The @Class@ datatype}
11 classKey, classSelIds, classTyCon,
13 classBigSig, classInstEnv,
18 #include "HsVersions.h"
20 import {-# SOURCE #-} TyCon ( TyCon )
21 import {-# SOURCE #-} Type ( Type )
22 import {-# SOURCE #-} SpecEnv ( SpecEnv )
24 import Var ( Id, TyVar )
25 import Name ( NamedThing(..), Name )
26 import Unique ( Unique, Uniquable(..) )
31 %************************************************************************
33 \subsection[Class-basic]{@Class@: basic definition}
35 %************************************************************************
37 A @Class@ corresponds to a Greek kappa in the static semantics:
42 Unique -- Key for fast comparison
45 [TyVar] -- The class type variables
47 [(Class,[Type])] -- Immediate superclasses, and the
48 [Id] -- corresponding selector functions to
49 -- extract them from a dictionary of this
52 [Id] -- * selector functions
53 [Maybe Id] -- * default methods
54 -- They are all ordered by tag. The
55 -- selector ids contain unfoldings.
57 ClassInstEnv -- All the instances of this class
59 TyCon -- The data type constructor for dictionaries
62 type ClassInstEnv = SpecEnv Id -- The Ids are dfuns
65 The @mkClass@ function fills in the indirect superclasses.
68 mkClass :: Name -> [TyVar]
69 -> [(Class,[Type])] -> [Id]
75 mkClass name tyvars super_classes superdict_sels
76 dict_sels defms tycon class_insts
77 = Class (getUnique name) name tyvars
78 super_classes superdict_sels
84 %************************************************************************
86 \subsection[Class-selectors]{@Class@: simple selectors}
88 %************************************************************************
90 The rest of these functions are just simple selectors.
93 classKey (Class key _ _ _ _ _ _ _ _) = key
94 classSuperClassTheta (Class _ _ _ scs _ _ _ _ _) = scs
95 classSelIds (Class _ _ _ _ _ sels _ _ _) = sels
96 classTyCon (Class _ _ _ _ _ _ _ _ tc) = tc
97 classInstEnv (Class _ _ _ _ _ _ _ env _) = env
99 classBigSig (Class _ _ tyvars super_classes sdsels sels defms _ _)
100 = (tyvars, super_classes, sdsels, sels, defms)
104 %************************************************************************
106 \subsection[Class-instances]{Instance declarations for @Class@}
108 %************************************************************************
110 We compare @Classes@ by their keys (which include @Uniques@).
113 instance Eq Class where
114 c1 == c2 = classKey c1 == classKey c2
115 c1 /= c2 = classKey c1 /= classKey c2
117 instance Ord Class where
118 c1 <= c2 = classKey c1 <= classKey c2
119 c1 < c2 = classKey c1 < classKey c2
120 c1 >= c2 = classKey c1 >= classKey c2
121 c1 > c2 = classKey c1 > classKey c2
122 compare c1 c2 = classKey c1 `compare` classKey c2
126 instance Uniquable Class where
127 getUnique c = classKey c
129 instance NamedThing Class where
130 getName (Class _ n _ _ _ _ _ _ _) = n
132 instance Outputable Class where
133 ppr c = ppr (getName c)
135 instance Show Class where
136 showsPrec p c = showsPrecSDoc p (ppr c)