Überladen gestattet die Definiton von Funktionen (bzw.
Operatoren), deren Bedeutung vom Typ ihrer Argumente
abhängig ist. So kann z.B. der Gleichheitsoperator (==)
sowohl auf Integer, als auch auf Characters (usw.)
angewendet werden.
Alle Typen, für die ein (überladener) Operator existiert,
werden in Typklassen zusammengefa. Die Klasse Eq
enthält z.B. alle Typen, die auf Gleichheit getestet
werden können.
Eine Typklasse besteht aus drei Teilen:
class Eq a where
(==), (/=) :: a -> a -> Bool
x /= y = not (x == y)
definiert eine neue Klasse Eq, die die member
functions (==) und (/=) enthält und die Definition
des Operators (/=) mit Hilfe der Operators (==) angibt.
Der Typ dieser Operatoren lautet jetzt:
Eq => a -> a -> BoolEin Typ, auf dem die Operatoren einer Typklasse arbeiten sollen, mudieser Typklasse zugeordnet werden. Dies geschied mit Hilfe des Schlüsselwortes instance:
instance Eq Bool where
True == True = True
False == False = True
_ == _ = False
fügt der Typklasse Eq den Typ Bool hinzu, und
definiert den Operator (==) auf diesem Typ. Der Operator
(/=) municht definiert werden, da er bereits bei der
Klassendefinition mit Hilfe des Gleichheitsoperators
definiert wurde. Nach dieser Definition können also
Bool'sche Werte auf Gleichheit überprüft werden. instance Eq Char where
c == d = ord c = ord d
Gestattet Zeichen auf Gleichheit zu testen. Zwei Zeichen sind gleich, falls ihre ASCII- Codes gleich sind.
instance Eq a => Eq [a] where
[] == [] = True
[] == (y:ys) = False
(x:xs) == [] = False
(x:xs) == (y:ys) = x == y && xs == ys
Bedeutung von (=>): Falls Typ a der Klasse Eq angehört, so soll auch der Typ [a] der Klasse Eq angehören. Anschliemuder Operator (==) auf [a] definiert werden.
instance (Eq a, Eq b) => Eq (a,b) where
(x, y) == (u, v) = x == y && u == v
wenn Typ a und Typ b zu Eq gehören, sollen auch Paare aus Elementen vom Typ a bzw. b auf Gleichheit prüfbar sein (d.h. zur Klasse Eq gehören)