Typklassen Stefan Wehr Kapitel 10 Haskell Kurs auf dem Sommercampus 2006 1 / 11 Verwendungszwecke Überladung von Funktionen: Gleichheitsvergleiche ==, <, . . . arithmetischen Operatoren +, ∗, . . . Konvertierung nach und von String Monaden ... Spezifizierung eines Interfaces (ohne Implementierung). Ähnlichkeiten mit Interfaces in Java, Signaturen in ML. Programmierung auf der Typebene. 2 / 11 Beispiel Typklasse Eq class Eq a where (==) :: a -> a -> Bool (/=) :: a -> a -> Bool x /= y = not (x == y) -- default definition 3 / 11 Beispiel Typklasse Eq class Eq a where (==) :: a -> a -> Bool (/=) :: a -> a -> Bool x /= y = not (x == y) -- default definition Instanzen von Eq instance Eq Int where i == j = primIntEq i j instance Eq Char where c == c’ = primCharEq c c’ c /= c’ = primtCharNeq c c’ 3 / 11 Benutzung von Typklassen elem :: Eq a => a -> [a] -> Bool elem x [] = False elem x (y:ys) = if x == y then True else elem x ys 4 / 11 Benutzung von Typklassen elem :: Eq a => a -> [a] -> Bool elem x [] = False elem x (y:ys) = if x == y then True else elem x ys Eq a ist der Kontext des Typs Eq a => a -> [a] -> Bool. Beispiel elem 1 [1,2,3] elem ’c’ "Stefan" 4 / 11 Instanz mit Kontext instance Eq a => Eq [a] where (x:xs) == (y:ys) = x == y && xs == ys l == l’ = null l && null l’ 5 / 11 Instanz mit Kontext instance Eq a => Eq [a] where (x:xs) == (y:ys) = x == y && xs == ys l == l’ = null l && null l’ Beispiel elem [1,2] [[],[1],[1,2],[1,2,3]] 5 / 11 Subklassen class Eq a => Ord a where compare :: a -> a -> Ordering (<) :: a -> a -> Bool -- andere Operatoren: >=, >, <= max :: a -> a -> a min :: a -> a -> a Beispiel elem’ :: Ord a => a -> [a] elem’ x [] = False elem’ x (y:ys) | x == y | x < y | otherwise -> Bool = True = False = elem’ x ys 6 / 11 Häufig verwendete Typklassen Eq und Ord: Vergleichsoperatoren Show und Read: Stringkonvertierung show :: Show a => a -> String read :: Read a => String -> a reads :: Read a => String -> [(a, String)] Monad: Monaden (später) Num, Real, Integral, Fractional, Floating, RealFrac, RealFloat: numerische Operationen (jetzt) 7 / 11 Numerische Typen Int Integer Float Double Ratio a Rational ganze Zahlen fixer Größe (mind. [−229 ..229 − 1]) ganze Zahlen beliebiger Größe Gleitkommazahlen, einfache Präzision Gleitkommazahlen, doppelte Präzision Bruchzahl (Zähler und Nenner vom Typ a) Synonym für Ratio Integer 8 / 11 Numerische Typklassen 9 / 11 Abgeleitete Instanzen (1) Instanzen von Hand zu schreiben ist langweilig! Beispiel data Expr = Val Int | Add Expr Expr | Mul Expr Expr instance Eq Expr where Val i == Val i’ Add e1 e2 == Add e1’ e2’ Mul e1 e2 == Mul e1’ e2’ _ == _ = = = = i == i’ e1 == e2 && e1’ == e2’ e1 == e2 && e1’ == e2’ False instance Show Expr where show (Val i) = "(Val " ++ show i ++ ")" show (Add e1 e2) = "(Add " ++ show e1 ++ " " ++ show e2 ++ ")" show (Mul e1 e2) = "(Mul " ++ show e1 ++ " " ++ show e2 ++ ")" 10 / 11 Abgeleitete Instanzen (2) Haskell kann automatisch Instanzen erzeugen! Beispiel data Expr = Val Int | Add Expr Expr | Mul Expr Expr deriving (Eq,Show) deriving funktioniert nur für folgende Typklassen: Eq Ord Enum Ix Bounded Read Show 11 / 11