Algebraische Typen Algebraische Typen Gliederung Algorithmen und Datenstrukturen I 1 Algebraische Typen D. Rösner Aufzählungstypen Produkttypen Rekursive algebraische Typen Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg Polymorphie Variante c Winter 2009/10, 16. November 2009, 2009/10 D.Rösner D. Rösner AuD I 2009/10 . . . Algebraische Typen 1 Einleitung Typsynonyme Algebraische Typen Polymorphie Variante D. Rösner AuD I 2009/10 . . . Algebraische Typen Datenstrukturen zur Modellierung: 2 Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Datenstrukturen zur Modellierung: Nachteile einer direkten Modellierung nur mit den elementaren Sprachmitteln: zur Modellierung von Gegenstandsbereichen stehen uns bisher zur Verfügung: mangelnde Abstraktion insbesondere Semantik nicht explizit gemacht Beispiel: Wofür könnte [[(String,Int,[Float])]] alles stehen? die vordefinierten elementaren Typen, also Int, Float, String, usw. als aggregierte Typen: Listentypen: [a] Tupeltypen: (a,b), (a,b,c), (a,b,c,d), . . . beliebige Kombinationen daraus, z.B. [[(String,Int,[Float])]]) ...................................................... ...................................................... damit lassen sich viele Beziehungen modellieren D. Rösner AuD I 2009/10 . . . Algebraische Typen Einleitung Typsynonyme Algebraische Typen daher Repräsentation auch schwer zu modifizieren und weiterzuentwickeln 4 D. Rösner AuD I 2009/10 . . . 5 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Algebraische Typen Typsynonyme zur Modellierung: Typsynonyme zur Modellierung: Typsynonyme können – wie Typen – in Signaturen verwendet werden mit type lassen sich sog. Typsynonyme definieren Beispiel: Beispiel: Typsynonym Student um Komponente für Semesterzahl erweitert type Student = (Name, Matrnr) type Name = String type Matrnr = Int allgemein: Beispiel type Student = (Name, Matrnr, Semester) durch type <Name> = <Typ> wird <Name> als Typsynonym für <Typ> eingeführt im Beispiel also der Typ Student als synonym zum Paartyp (Name, Matrnr), der wiederum synonym zu (String, Int) D. Rösner AuD I 2009/10 . . . Algebraische Typen type Name = String type Matrnr = Int type Semester = Int 7 Einleitung Typsynonyme Algebraische Typen Polymorphie Variante D. Rösner AuD I 2009/10 . . . Algebraische Typen Typsynonyme zur Modellierung: 8 Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Typsynonyme zur Modellierung: Funktion rueckmelden, die Semesterzahl erhöht Typsynonyme können die intendierte Verwendung von Datenstrukturen im Programmcode deutlich machen Beispiel sie führen aber nicht zu neuen, eigenständigen Datentypen, sondern können jederzeit in ihre Definition expandiert werden rueckmelden :: Student -> Student rueckmelden (name, matr, sem) = (name, matr, sem+1) D. Rösner AuD I 2009/10 . . . Einleitung Typsynonyme Algebraische Typen Polymorphie Variante 9 D. Rösner AuD I 2009/10 . . . 10 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Algebraische Typen Typsynonyme zur Modellierung: Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Typsynonyme zur Modellierung: Beispiel: Definition von Instanzen Interaktion fortgesetzt: stud1 = ("Mueller", 1234567, 3)::Student stud2 = ("Meier", 2345678, 1)::Student Main> map rueckmelden [stud1, stud2] [("Mueller",1234567,4),("Meier",2345678,2) Beispiele einer Interaktion Main> map (rueckmelden.rueckmelden) [stud1, stud2] [("Mueller",1234567,5),("Meier",2345678,3)] Main> stud1 ("Mueller",1234567,3) Main> rueckmelden stud1 ("Mueller",1234567,4) Main> stud1 ("Mueller",1234567,3) Main> :t rueckmelden rueckmelden :: Student -> Student Main> :t map (rueckmelden.rueckmelden) [stud1, stud2] map (rueckmelden . rueckmelden) [stud1,stud2] :: [([Char],Int,Int)] D. Rösner AuD I 2009/10 . . . Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Algebraische Typen Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Typen mit Komponenten (sog. Produkttypen) als algebraische Typen Beispiel: data Temp = Cold | Hot data Season = Spring | Summer | Autumn | Winter Pattern matching zur Definition von Funktionen data People = Person Name Age weather :: Season -> Temp weather Summer = Hot weather _ = Cold type Name = String type Age = Int Definition von Gleichheit für Temp Cold Hot _ 12 Produkttypen als algebraische Typen Aufzählungstypen (vgl. [Tho99], 14.1) Beispiel: Cold == Hot == _ == D. Rösner AuD I 2009/10 . . . 11 Beispiele: = True = True = False D. Rösner AuD I 2009/10 . . . Person "Hans Mueller" 42 Person "Bart Simpson" 12 14 D. Rösner AuD I 2009/10 . . . 15 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Algebraische Typen Produkttypen als algebraische Typen cont. Produkttypen mit Alternativen oft gibt es unterschiedliche Arten von Objekten, die zu einem Typ gehören Pattern matching zur Definition von Funktionen ein Geometrie-Programm könnte z.B. zunächst mit Kreisen und Rechtecken als geometrischen Objekten beginnen (s.a. [Tho99], 14.1) showPerson :: People -> String showPerson (Person st n) = st ++ " -- " ++ show n data GeoObj = Kreis Float| Rechteck Float Float hier gibt es also zwei Konstruktorfunktionen Konstruktor Person ist Funktion vom Typ Person :: Name -> Age -> People D. Rösner AuD I 2009/10 . . . Algebraische Typen eine für Kreise mit Radius eine für Rechtecke mit den beiden Seitenlängen für Länge und Breite D. Rösner AuD I 2009/10 . . . 16 Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Algebraische Typen Produkttypen mit Alternativen 17 Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Rekursive algebraische Typen Beispiel einer Interaktion Beispiel: arithmetische Ausdrücke mit ganzen Zahlen Definition von Instanzen Kreis 5.0 Rechteck 12.4 29.7 Pattern matching bei Definition von Funktionen flaeche :: GeoObj -> Float data Expr = Lit Int| Add Expr Expr| Sub Expr Expr Beispiele: flaeche (Kreis r) = pi*r*r flaeche (Rechteck laenge breite) = laenge*breite D. Rösner AuD I 2009/10 . . . Einleitung Typsynonyme Algebraische Typen Polymorphie Variante 18 7 4+7 (7-4)+11 Lit 7 Add (Lit 4) (Lit 7) Add (Sub (Lit 7)(Lit 4)) (Lit 11) D. Rösner AuD I 2009/10 . . . 19 Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Algebraische Typen Algebraische Typen Rekursive algebraische Typen cont. Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Rekursive algebraische Typen cont. Beispiel: Bäume mit ganzen Zahlen Funktionen mit Hilfe primitiver Rekursion z.B. Auswerten data NTree = NilT | Node Int NTree NTree Beispiele für Funktionen: eval :: Expr -> Int sumTree, depth :: NTree -> Int eval (Lit n) eval (Add e1 e2) eval (Sub e1 e2) = n = (eval e1) + (eval e2) = (eval e1) - (eval e2) sumTree NilT = 0 sumTree (Node n t1 t2) = n + sumTree t1 + sumTree t2 ... D. Rösner AuD I 2009/10 . . . 20 Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Algebraische Typen Algebraische Typen Beispiele für Funktionen: cont. 21 Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Polymorphe algebraische Typen: Definitionen algebraischer Typen können Typvariable a, b, ... enthalten (vgl. [Tho99], 14.3) ... depth NilT D. Rösner AuD I 2009/10 . . . = 0 Beispiel: depth (Node n t1 t2) = 1 + max (depth t1)(depth t2) data Pairs a = Pr a a occurs :: NTree -> Int -> Int einige Ausprägungen: occurs NilT p = 0 Pr 47 11 :: Pairs Int Pr [] [42] :: Pairs [Int] Pr [] [] :: Pairs [a] occurs (Node n t1 t2) p | n==p = 1 + occurs t1 p + occurs t2 p | otherwise = occurs t1 p + occurs t2 p D. Rösner AuD I 2009/10 . . . 22 D. Rösner AuD I 2009/10 . . . 24 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Algebraische Typen Polymorphe algebraische Typen: Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Binäre Bäume als polymorphe algebraische Typen Binäre Bäume als polymorphe algebraische Typen die Elemente in den Knoten können von bel. Typ sein mögliche Definition: Definitionen algebraischer Typen können Typvariable a, b, ... enthalten (vgl. [Tho99], 14.3) der eingebaute Listentyp könnte wie folgt definiert sein: data Tree a = Nil | Node a (Tree a) (Tree a) deriving (Eq, Ord, Show, Read) data List a = NilList | Cons a (List a) Beispiel einer Funktion auf binären Bäumen: deriving (Eq, Ord, Show, Read) D. Rösner AuD I 2009/10 . . . Algebraische Typen depth :: Tree a -> Int depth Nil = 0 depth (Node n t1 t2) = 1 + max (depth t1)(depth t2) 25 Einleitung Typsynonyme Algebraische Typen Polymorphie Variante D. Rösner AuD I 2009/10 . . . Algebraische Typen Binäre Bäume . . . 26 Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Binäre Bäume . . . aus Baum Liste ‘kollabieren’ bei Inorder-Traversierung collapse :: Tree a -> [a] mapTree als Funktion höherer Ordnung auf binären Bäumen collapse Nil = [] collapse (Node n t1 t2) = collapse t1 ++ [n] ++ collapse t2 mapTree :: (a -> b) -> Tree a -> Tree b mapTree f Nil Beispiel: collapse (Node 7 (Node 4 Nil Nil) (Node 1 (Node 1 Nil Nil) Nil)) = [4,7,1,1] D. Rösner AuD I 2009/10 . . . = Nil mapTree f (Node n t1 t2) = Node (f n) (mapTree f t1) (mapTree f t2) 27 D. Rösner AuD I 2009/10 . . . 28 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Algebraische Typen Algebraische Typen: Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Algebraische Typen: Variante Instanzen werden kreiert mithilfe des Konstruktors und der benannten Selektoren für Produkttypen gibt es eine alternative Syntax: Beispiel: data Person’ = Person’ {name :: Name, age :: Age} deriving (Eq,Show,Read) Beispiel >p1 = Person’ {name = "Paul", age = 21} type Name = String type Age = Int da der Selektor die jeweilige Komponente eindeutig benennt, ist die Reihenfolge der Angaben beliebig m.a.W.: statt einer ’positionalen’ Kodierung der Komponenten eines Produkttyps haben wir hier eine Kodierung mit benannten Selektoren D. Rösner AuD I 2009/10 . . . Algebraische Typen Beispiel >p2 = Person’ {age = 12, name = "Pauline"} 30 Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Algebraische Typen Algebraische Typen: Variante 31 Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Algebraische Typen: Variante die Ausgabe durch die abgeleitete show-Funktion erfolgt aber in der Reihenfolge aus der data-Definition mit den benannten Selektorfunktionen kann auf die Werte der Komponenten zugegriffen werden Beispiel: Beispiel Main> name p1 "Paul" Main> age p2 12 Main> p1 Person’{name="Paul",age=21} Main> p2 Person’{name="Pauline",age=12} D. Rösner AuD I 2009/10 . . . D. Rösner AuD I 2009/10 . . . 32 D. Rösner AuD I 2009/10 . . . 33 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Algebraische Typen Algebraische Typen: Variante Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Algebraische Typen: Variante beachte: bei der Modifikation wird eine modifizierte Kopie der Ausgangsinstanz kreiert, d.h. diese bleibt unverändert Beispiel: Konstruktor und Selektoren können in Funktionen zur Modifikation von Instanzen verwendet werden Beispiel: Main> p1 Person’{name="Paul",age=21} hasBirthday :: Person’ -> Person’ Main> hasBirthday p1 Person’{name="Paul",age=22} hasBirthday p = Person’ {name= name p, age= age p + 1} Main> p1 Person’{name="Paul",age=21} D. Rösner AuD I 2009/10 . . . Algebraische Typen 34 Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Literatur: I Simon Thompson. Haskell - The Craft of Functional Programming. Addison Wesley Longman Ltd., Essex, 1999. 2nd edition, ISBN 0-201-34275-8; Accompanying Web site: http://www.cs.ukc.ac.uk/people/staff/sjt/craft2e. D. Rösner AuD I 2009/10 . . . 36 D. Rösner AuD I 2009/10 . . . 35