Überladen in Gofer



next up previous
Next: References Up: Gofer-Kurzübersicht Previous: Monadisches I/O

Überladen in Gofer

Ü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:

Die Definition einer Typklasse erfolgt mit dem Schlüsselwort class:
        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 -> Bool
Ein 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.
Weitere Beispiele:
        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)



Sven Eric Panitz
Mi., 01. Nov. 1995, 12:17:13