Typen und Klassen Hubert Wagner 18. Januar 2008 Hubert Wagner () Typen und Klassen 18. Januar 2008 1 / 16 Datentypen Basis-Datentypen wie z.B. Hubert Wagner () Typen und Klassen 18. Januar 2008 2 / 16 Datentypen Basis-Datentypen wie z.B. Int Hubert Wagner () Typen und Klassen 18. Januar 2008 2 / 16 Datentypen Basis-Datentypen wie z.B. Int Bool Hubert Wagner () Typen und Klassen 18. Januar 2008 2 / 16 Datentypen Basis-Datentypen wie z.B. Int Bool Datentypen mittels Konstruktionen: Hubert Wagner () Typen und Klassen 18. Januar 2008 2 / 16 Datentypen Basis-Datentypen wie z.B. Int Bool Datentypen mittels Konstruktionen: [Float] Hubert Wagner () Typen und Klassen 18. Januar 2008 2 / 16 Datentypen Basis-Datentypen wie z.B. Int Bool Datentypen mittels Konstruktionen: [Float] (Int, Bool) Hubert Wagner () Typen und Klassen 18. Januar 2008 2 / 16 Datentypen Basis-Datentypen wie z.B. Int Bool Datentypen mittels Konstruktionen: [Float] (Int, Bool) Int -> (Int -> Int) Hubert Wagner () Typen und Klassen 18. Januar 2008 2 / 16 Datentypen Basis-Datentypen wie z.B. Int Bool Datentypen mittels Konstruktionen: [Float] (Int, Bool) Int -> (Int -> Int) Typsynonyme Hubert Wagner () Typen und Klassen 18. Januar 2008 2 / 16 Datentypen Basis-Datentypen wie z.B. Int Bool Datentypen mittels Konstruktionen: [Float] (Int, Bool) Int -> (Int -> Int) Typsynonyme type Point = (Float, Float) Hubert Wagner () Typen und Klassen 18. Januar 2008 2 / 16 Datentypen Basis-Datentypen wie z.B. Int Bool Datentypen mittels Konstruktionen: [Float] (Int, Bool) Int -> (Int -> Int) Typsynonyme type Point = (Float, Float) type Parser a = String -> [(a, String)] Hubert Wagner () Typen und Klassen 18. Januar 2008 2 / 16 Datentypen Basis-Datentypen wie z.B. Int Bool Datentypen mittels Konstruktionen: [Float] (Int, Bool) Int -> (Int -> Int) Typsynonyme type Point = (Float, Float) type Parser a = String -> [(a, String)] benutzerde…nierte Datentypen Hubert Wagner () Typen und Klassen 18. Januar 2008 2 / 16 Datentypen Basis-Datentypen wie z.B. Int Bool Datentypen mittels Konstruktionen: [Float] (Int, Bool) Int -> (Int -> Int) Typsynonyme type Point = (Float, Float) type Parser a = String -> [(a, String)] benutzerde…nierte Datentypen data Tage = Montag j Dienstag j Mittwoch j Donnerstag Hubert Wagner () Typen und Klassen 18. Januar 2008 2 / 16 Datentypen Basis-Datentypen wie z.B. Int Bool Datentypen mittels Konstruktionen: [Float] (Int, Bool) Int -> (Int -> Int) Typsynonyme type Point = (Float, Float) type Parser a = String -> [(a, String)] benutzerde…nierte Datentypen data Tage = Montag j Dienstag j Mittwoch j Donnerstag data Tree a = Node a [Tree a] Hubert Wagner () Typen und Klassen 18. Januar 2008 2 / 16 (Typ-) Klassen Menge von Typen Hubert Wagner () Typen und Klassen 18. Januar 2008 3 / 16 (Typ-) Klassen Menge von Typen Signatur, d.h. Liste von Operatoren mit zugehöriger Typangabe Hubert Wagner () Typen und Klassen 18. Januar 2008 3 / 16 (Typ-) Klassen Menge von Typen Signatur, d.h. Liste von Operatoren mit zugehöriger Typangabe jeder Typ in der Typklasse beinhaltet die Operatoren Reihe von Typklassen in der Standardbibliothek de…niert Hubert Wagner () Typen und Klassen 18. Januar 2008 3 / 16 Beispiele de…nierter Typklassen class Eq a where (==), (/=) x /= y Hubert Wagner () :: = a -> a -> Bool not (x == y) Typen und Klassen 18. Januar 2008 4 / 16 Beispiele de…nierter Typklassen class Eq a where (==), (/=) :: a -> a -> Bool x /= y = not (x == y) Jeder Typ in dieser Typklasse besitzt diese beiden Funktionen Hubert Wagner () Typen und Klassen 18. Januar 2008 4 / 16 Beispiele de…nierter Typklassen class Eq a where (==), (/=) :: a -> a -> Bool x /= y = not (x == y) Jeder Typ in dieser Typklasse besitzt diese beiden Funktionen Basistypen sind Elemente dieser Typklasse Hubert Wagner () Typen und Klassen 18. Januar 2008 4 / 16 Beispiele de…nierter Typklassen class Eq a where (==), (/=) :: a -> a -> Bool x /= y = not (x == y) Jeder Typ in dieser Typklasse besitzt diese beiden Funktionen Basistypen sind Elemente dieser Typklasse Zugehörigkeit eines Typs T zu einer Typklasse C wird ausgedrückt durch instance C T where . . . wobei in . . . die Operatoren von C für den Typ T zu konkretisieren sind Hubert Wagner () Typen und Klassen 18. Januar 2008 4 / 16 Beispiele de…nierter Typklassen class Eq a where (==), (/=) :: a -> a -> Bool x /= y = not (x == y) Jeder Typ in dieser Typklasse besitzt diese beiden Funktionen Basistypen sind Elemente dieser Typklasse Zugehörigkeit eines Typs T zu einer Typklasse C wird ausgedrückt durch instance C T where . . . wobei in . . . die Operatoren von C für den Typ T zu konkretisieren sind Example instance Eq False True _ Bool where == False == True == _ Hubert Wagner () = True = True = False Typen und Klassen 18. Januar 2008 4 / 16 Abgeleitete Typklassen Typklasse kann durch Hinzunahme neuer Operatoren zu neuer Typklasse abgeleitet werden (die hierdurch festgelegte Menge von Typen ist eine Teilmenge der Ausgangsmenge) Hubert Wagner () Typen und Klassen 18. Januar 2008 5 / 16 Abgeleitete Typklassen Typklasse kann durch Hinzunahme neuer Operatoren zu neuer Typklasse abgeleitet werden (die hierdurch festgelegte Menge von Typen ist eine Teilmenge der Ausgangsmenge) Ableitung einer Typklasse F aus Typklasse T wird ausgedrückt durch class T => F where . . . wobei in . . . die hinzugekommenen Operatoren de…niert werden Hubert Wagner () Typen und Klassen 18. Januar 2008 5 / 16 Example Die Klasse Ord a von Typen, deren Elemente vollständig geordnet sind, wird de…niert als Ableitung aus der Typklasse Eq a durch class Eq a => Ord a where (<), (<=), (>), (>=) min, max min x y j x <= y j otherwise max x y j x <= y j otherwise Hubert Wagner () :: :: = = = = a -> a -> Bool a -> a -> a x y y x Typen und Klassen 18. Januar 2008 6 / 16 Weitere de…nierte Typklassen Aufzählungstypklasse: Enum Example class Ord a => Enum a where toEnum :: Int -> a fromEnum :: a -> Int enumFrom :: a -> [a] enumFromThen :: a -> a -> [a] enumFromTo :: a -> a -> [a] enumFromThenTo :: a -> a -> a -> [a] Hubert Wagner () Typen und Klassen - - [n ..] [n,m ..] [n .. m] [n,k .. m] 18. Januar 2008 7 / 16 Weitere de…nierte Typklassen Show a Hubert Wagner () Typen und Klassen 18. Januar 2008 8 / 16 Weitere de…nierte Typklassen Show a Read a Hubert Wagner () Typen und Klassen 18. Januar 2008 8 / 16 Weitere de…nierte Typklassen Show a Read a Num a, wobei Hubert Wagner () Typen und Klassen 18. Januar 2008 8 / 16 Weitere de…nierte Typklassen Show a Read a Num a, wobei De…nition class (Eq a, Show a) => Num a (+), (-), (?) :: negate :: abs, signum :: fromInteger :: fromInt :: x-y = fromInt = Hubert Wagner () where a -> a -> a a -> a a -> a Integer -> a Int -> a x + negate y fromIntegral Typen und Klassen 18. Januar 2008 8 / 16 Example Typklasse Stack s mit polymorphen Datentypen s, auf denen die üblichen Stack-Operationen de…niert sind: De…nition class Stack s where push top pop isEmptyStack showStack showStack st Hubert Wagner () :: :: :: :: :: = a -> s a -> s a s a -> a s a -> s a s a -> Bool (Show a) => s a -> String if isEmptyStack st then ”!” else (show (top st))++ ”-” ++(showStack (pop st)) Typen und Klassen 18. Januar 2008 9 / 16 Stack-Implementierung durch Terme Example data TermStack a = EmptyStack j Push a (TermStack a) Einordnung in die Typklasse Stack: instance Stack TermStack where push isEmptyStack (EmptyStack) isEmptyStack (Push _ _) pop (EmptyStack) pop (Push _ s) top (EmptyStack) top (Push e _) = = = = = = = Push True False error ”pop on empty stack” s error ”top on empty stack” e Instanz-Deklaration muss mindestens die Methoden de…nieren, für die keine Default-De…nition vorliegt Hubert Wagner () Typen und Klassen 18. Januar 2008 10 / 16 Typklasse Monade von Bedeutung für Programme mit Seitene¤ekten (z.B. IO-Operationen) Example In einem Programm sei ein Ausdruck der Form auszuführen: inputInt - inputInt wobei mit inputInt ein Integer-Wert von der Tastatur eingegeben wird. Was wäre das Resultat, wenn 12 und 8 eingegeben werden? Resultat abhängig von der Reihenfolge der Auswertung (u.U. von Betriebssystem oder Hardware abhängig) Lösung in Haskell mit Monaden-Konzept: Explizit festgelegte Verarbeitungsfolge wird mittels der Monadenoperatoren erreicht Hubert Wagner () Typen und Klassen 18. Januar 2008 11 / 16 Typklasse Monade De…nition class Monad m where (>>=) return (>>) fail m >> k fail s :: :: :: :: = = Hubert Wagner () m a -> (a -> m b) -> m b a -> m a m a -> m b -> m b String -> m a m >>= n_ -> k error s Typen und Klassen Bind-Operator Sequentialisierungsoperator 18. Januar 2008 12 / 16 Wirkungsweise des Bind-Operators Example Der Bind-Operator arbeitet wie folgt: In w >>= f mit w vom Typ m a und f vom Typ m a -> m b wird der in w durch die Monade gekapselte Wert x vom Typ a als Argument an die Funktion „gebunden”, f liefert für x dann einen durch die Monade gekapselten Wert vom Typ b als Ergebnis, dieser ist dann das Ergebnis. Der Bind-Operator in do-Notation: do x <- w f x Example test :: IO () test = do x <- readInt print (x+5) Hubert Wagner () Typen und Klassen 18. Januar 2008 13 / 16 Beispiele für Monaden Example Die Monade Identität: data Id a = Id a instance Monad Id where (Id x) >>= f = return x = fx Id x Um Elemente anzeigen zu können: instance Show a => Show (Id a) where show (Id x) = "Wert: "++ show x Hubert Wagner () Typen und Klassen 18. Januar 2008 14 / 16 Beispiele für Monaden Example instance Monad Parser where (>>=) :: Parser a -> (a -> Parser b) -> Parser b p >>= f = ninp -> case parse p inp of [ ] _> [ ] [(v,out)] _> parse (f v) out return :: a -> Parser return x = ninp -> [(x, inp)] parse wie im Kapitel für Parser de…niert Hubert Wagner () Typen und Klassen 18. Januar 2008 15 / 16 Beispiele für Monaden Example Ausdrücke vom Typ IO a sind Aktionen. type IO a = World -> (a,World) Typ World repräsentiert Zustand des Systems instance Monad IO where (>>=) :: IO a -> (a -> IO b) -> IO b p >>= f = nworld -> case p world of (v, world’) -> f v world’ return :: a -> IO a return x = nworld -> (x,world) return und >>= wie im Kapitel für IO de…niert Hubert Wagner () Typen und Klassen 18. Januar 2008 16 / 16