Ü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 _ == _ = Falsefü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)