2 {-# OPTIONS_GHC -XNoImplicitPrelude #-}
3 {-# OPTIONS_GHC -fno-warn-unused-imports #-}
4 -- XXX -fno-warn-unused-imports needed for the GHC.Tuple import below. Sigh.
5 {-# OPTIONS_HADDOCK hide #-}
6 -----------------------------------------------------------------------------
8 -- Module : GHC.Classes
9 -- Copyright : (c) The University of Glasgow, 1992-2002
10 -- License : see libraries/base/LICENSE
12 -- Maintainer : cvs-ghc@haskell.org
13 -- Stability : internal
14 -- Portability : non-portable (GHC extensions)
18 -----------------------------------------------------------------------------
20 module GHC.Classes where
23 -- GHC.Magic is used in some derived instances
31 infix 4 ==, /=, <, <=, >=, >
35 default () -- Double isn't available yet
37 -- | The 'Eq' class defines equality ('==') and inequality ('/=').
38 -- All the basic datatypes exported by the "Prelude" are instances of 'Eq',
39 -- and 'Eq' may be derived for any datatype whose constituents are also
42 -- Minimal complete definition: either '==' or '/='.
45 (==), (/=) :: a -> a -> Bool
52 deriving instance Eq ()
53 deriving instance (Eq a, Eq b) => Eq (a, b)
54 deriving instance (Eq a, Eq b, Eq c) => Eq (a, b, c)
55 deriving instance (Eq a, Eq b, Eq c, Eq d) => Eq (a, b, c, d)
56 deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e) => Eq (a, b, c, d, e)
57 deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f)
58 => Eq (a, b, c, d, e, f)
59 deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g)
60 => Eq (a, b, c, d, e, f, g)
61 deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,
63 => Eq (a, b, c, d, e, f, g, h)
64 deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,
66 => Eq (a, b, c, d, e, f, g, h, i)
67 deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,
69 => Eq (a, b, c, d, e, f, g, h, i, j)
70 deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,
71 Eq h, Eq i, Eq j, Eq k)
72 => Eq (a, b, c, d, e, f, g, h, i, j, k)
73 deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,
74 Eq h, Eq i, Eq j, Eq k, Eq l)
75 => Eq (a, b, c, d, e, f, g, h, i, j, k, l)
76 deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,
77 Eq h, Eq i, Eq j, Eq k, Eq l, Eq m)
78 => Eq (a, b, c, d, e, f, g, h, i, j, k, l, m)
79 deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,
80 Eq h, Eq i, Eq j, Eq k, Eq l, Eq m, Eq n)
81 => Eq (a, b, c, d, e, f, g, h, i, j, k, l, m, n)
82 deriving instance (Eq a, Eq b, Eq c, Eq d, Eq e, Eq f, Eq g,
83 Eq h, Eq i, Eq j, Eq k, Eq l, Eq m, Eq n, Eq o)
84 => Eq (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)
86 instance (Eq a) => Eq [a] where
87 {-# SPECIALISE instance Eq [Char] #-}
89 (x:xs) == (y:ys) = x == y && xs == ys
92 deriving instance Eq Bool
93 deriving instance Eq Ordering
95 instance Eq Char where
96 (C# c1) == (C# c2) = c1 `eqChar#` c2
97 (C# c1) /= (C# c2) = c1 `neChar#` c2
99 -- | The 'Ord' class is used for totally ordered datatypes.
101 -- Instances of 'Ord' can be derived for any user-defined
102 -- datatype whose constituent types are in 'Ord'. The declared order
103 -- of the constructors in the data declaration determines the ordering
104 -- in derived 'Ord' instances. The 'Ordering' datatype allows a single
105 -- comparison to determine the precise ordering of two objects.
107 -- Minimal complete definition: either 'compare' or '<='.
108 -- Using 'compare' can be more efficient for complex types.
110 class (Eq a) => Ord a where
111 compare :: a -> a -> Ordering
112 (<), (<=), (>), (>=) :: a -> a -> Bool
113 max, min :: a -> a -> a
115 compare x y = if x == y then EQ
116 -- NB: must be '<=' not '<' to validate the
117 -- above claim about the minimal things that
118 -- can be defined for an instance of Ord:
119 else if x <= y then LT
122 x < y = case compare x y of { LT -> True; _ -> False }
123 x <= y = case compare x y of { GT -> False; _ -> True }
124 x > y = case compare x y of { GT -> True; _ -> False }
125 x >= y = case compare x y of { LT -> False; _ -> True }
127 -- These two default methods use '<=' rather than 'compare'
128 -- because the latter is often more expensive
129 max x y = if x <= y then y else x
130 min x y = if x <= y then x else y
132 deriving instance Ord ()
133 deriving instance (Ord a, Ord b) => Ord (a, b)
134 deriving instance (Ord a, Ord b, Ord c) => Ord (a, b, c)
135 deriving instance (Ord a, Ord b, Ord c, Ord d) => Ord (a, b, c, d)
136 deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e) => Ord (a, b, c, d, e)
137 deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f)
138 => Ord (a, b, c, d, e, f)
139 deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g)
140 => Ord (a, b, c, d, e, f, g)
141 deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g,
143 => Ord (a, b, c, d, e, f, g, h)
144 deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g,
146 => Ord (a, b, c, d, e, f, g, h, i)
147 deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g,
149 => Ord (a, b, c, d, e, f, g, h, i, j)
150 deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g,
151 Ord h, Ord i, Ord j, Ord k)
152 => Ord (a, b, c, d, e, f, g, h, i, j, k)
153 deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g,
154 Ord h, Ord i, Ord j, Ord k, Ord l)
155 => Ord (a, b, c, d, e, f, g, h, i, j, k, l)
156 deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g,
157 Ord h, Ord i, Ord j, Ord k, Ord l, Ord m)
158 => Ord (a, b, c, d, e, f, g, h, i, j, k, l, m)
159 deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g,
160 Ord h, Ord i, Ord j, Ord k, Ord l, Ord m, Ord n)
161 => Ord (a, b, c, d, e, f, g, h, i, j, k, l, m, n)
162 deriving instance (Ord a, Ord b, Ord c, Ord d, Ord e, Ord f, Ord g,
163 Ord h, Ord i, Ord j, Ord k, Ord l, Ord m, Ord n, Ord o)
164 => Ord (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o)
166 instance (Ord a) => Ord [a] where
167 {-# SPECIALISE instance Ord [Char] #-}
169 compare [] (_:_) = LT
170 compare (_:_) [] = GT
171 compare (x:xs) (y:ys) = case compare x y of
175 deriving instance Ord Bool
176 deriving instance Ord Ordering
178 -- We don't use deriving for Ord Char, because for Ord the derived
179 -- instance defines only compare, which takes two primops. Then
180 -- '>' uses compare, and therefore takes two primops instead of one.
181 instance Ord Char where
182 (C# c1) > (C# c2) = c1 `gtChar#` c2
183 (C# c1) >= (C# c2) = c1 `geChar#` c2
184 (C# c1) <= (C# c2) = c1 `leChar#` c2
185 (C# c1) < (C# c2) = c1 `ltChar#` c2
187 -- OK, so they're technically not part of a class...:
192 (&&) :: Bool -> Bool -> Bool
197 (||) :: Bool -> Bool -> Bool