Typklassen

Werbung
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
Herunterladen