Typklassen bisher

-
hierarchische Organisation
-
definieren Verhalten von Datenypen, wie Test auf Gleichheit, Anordnung, etc
-
ermöglichen überladene Funktionen
Definition von Typklassen → class

- Ein Typ a, der zur Klasse Eq gehört, muss Operationen der Gleichheit und Ungleichheit unterstützen, gemäß der vorgegebenen Typdeklaration
- Definitionen von = und /= nur default definitions
- Da = und /= durch wechselseitige Rekursion definiert sind, muss mindestens eine der beiden Operationen in der Deklaration einer Instanz von Eq definiert sein.
Bool als Instanz von Eq
data Bool = False | True
instance Eq Bool where
False == False = True
True == True = True
_ == _ = False - Ungleichheit ist durch default definition in Eq geregelt
- Gleichheit hier überschrieben
- minimal vollständige Definition von Bool als Instanz von Eq
Nur mit data oder newtype definierte Datentypen können Typklassen zugeordnet werden
noch ein Beispiel
data Ampel = Rot | Gelb | Gruen
instance Show Ampel where
show Rot = “Rot: Stop!”
show Gelb = “Gelb: Achtung!”
show Gruen = “Gruen: Go!” Unterklassen von Klassen definieren
Beispiel: Ord als Unterklasse von Eq (unvollständig):
class (Eq a) => Ord a where
(...)
(<), (<=), (>), (>=) :: a -> a -> Bool
min, max :: a -> a-> a
(...) Abkürzung zu Typklassendeklarationen → deriving
data Bool = False | True
deriving (Eq, Ord, Show, Read)
data Ampel = Rot | Gelb | Gruen deriving Show