Algebraische Typen Algorithmen und Datenstrukturen I Algebraische Typen D. Rösner Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg c Winter 2009/10, 16. November 2009, 2009/10 D.Rösner D. Rösner AuD I 2009/10 . . . 1 Algebraische Typen Gliederung 1 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Aufzählungstypen Produkttypen Rekursive algebraische Typen Polymorphie Variante D. Rösner AuD I 2009/10 . . . 2 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Datenstrukturen zur Modellierung: zur Modellierung von Gegenstandsbereichen stehen uns bisher zur Verfügung: 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 . . . 4 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Datenstrukturen zur Modellierung: Nachteile einer direkten Modellierung nur mit den elementaren Sprachmitteln: mangelnde Abstraktion insbesondere Semantik nicht explizit gemacht Beispiel: Wofür könnte [[(String,Int,[Float])]] alles stehen? ................................................. ................................................. daher Repräsentation auch schwer zu modifizieren und weiterzuentwickeln D. Rösner AuD I 2009/10 . . . 5 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Typsynonyme zur Modellierung: mit type lassen sich sog. Typsynonyme definieren Beispiel: type Student = (Name, Matrnr) type Name = String type Matrnr = Int allgemein: 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 . . . 7 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Typsynonyme zur Modellierung: Typsynonyme können – wie Typen – in Signaturen verwendet werden Beispiel: Typsynonym Student um Komponente für Semesterzahl erweitert Beispiel type Student = (Name, Matrnr, Semester) type Name = String type Matrnr = Int type Semester = Int D. Rösner AuD I 2009/10 . . . 8 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Typsynonyme zur Modellierung: Funktion rueckmelden, die Semesterzahl erhöht Beispiel rueckmelden :: Student -> Student rueckmelden (name, matr, sem) = (name, matr, sem+1) D. Rösner AuD I 2009/10 . . . 9 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Typsynonyme zur Modellierung: Typsynonyme können die intendierte Verwendung von Datenstrukturen im Programmcode deutlich machen sie führen aber nicht zu neuen, eigenständigen Datentypen, sondern können jederzeit in ihre Definition expandiert werden D. Rösner AuD I 2009/10 . . . 10 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Typsynonyme zur Modellierung: Beispiel: Definition von Instanzen stud1 = ("Mueller", 1234567, 3)::Student stud2 = ("Meier", 2345678, 1)::Student Beispiele einer Interaktion Main> stud1 ("Mueller",1234567,3) Main> rueckmelden stud1 ("Mueller",1234567,4) Main> stud1 ("Mueller",1234567,3) D. Rösner AuD I 2009/10 . . . 11 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Typsynonyme zur Modellierung: Interaktion fortgesetzt: Main> map rueckmelden [stud1, stud2] [("Mueller",1234567,4),("Meier",2345678,2) Main> map (rueckmelden.rueckmelden) [stud1, stud2] [("Mueller",1234567,5),("Meier",2345678,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 . . . 12 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Algebraische Typen Aufzählungstypen (vgl. [Tho99], 14.1) Beispiel: data Temp = Cold | Hot data Season = Spring | Summer | Autumn | Winter Pattern matching zur Definition von Funktionen weather :: Season -> Temp weather Summer = Hot weather _ = Cold Definition von Gleichheit für Temp Cold == Hot == _ == Cold Hot _ = True = True = False D. Rösner AuD I 2009/10 . . . 14 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Produkttypen als algebraische Typen Typen mit Komponenten (sog. Produkttypen) als algebraische Typen Beispiel: data People = Person Name Age type Name = String type Age = Int Beispiele: Person "Hans Mueller" 42 Person "Bart Simpson" 12 D. Rösner AuD I 2009/10 . . . 15 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Produkttypen als algebraische Typen cont. Pattern matching zur Definition von Funktionen showPerson :: People -> String showPerson (Person st n) = st ++ " -- " ++ show n Konstruktor Person ist Funktion vom Typ Person :: Name -> Age -> People D. Rösner AuD I 2009/10 . . . 16 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Produkttypen mit Alternativen oft gibt es unterschiedliche Arten von Objekten, die zu einem Typ gehören ein Geometrie-Programm könnte z.B. zunächst mit Kreisen und Rechtecken als geometrischen Objekten beginnen (s.a. [Tho99], 14.1) data GeoObj = Kreis Float| Rechteck Float Float hier gibt es also zwei Konstruktorfunktionen 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 . . . 17 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Produkttypen mit Alternativen Beispiel einer Interaktion Definition von Instanzen Kreis 5.0 Rechteck 12.4 29.7 Pattern matching bei Definition von Funktionen flaeche :: GeoObj -> Float flaeche (Kreis r) = pi*r*r flaeche (Rechteck laenge breite) = laenge*breite D. Rösner AuD I 2009/10 . . . 18 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Rekursive algebraische Typen Beispiel: arithmetische Ausdrücke mit ganzen Zahlen data Expr = Lit Int| Add Expr Expr| Sub Expr Expr Beispiele: 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 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Rekursive algebraische Typen cont. Funktionen mit Hilfe primitiver Rekursion z.B. Auswerten eval :: Expr -> Int eval (Lit n) eval (Add e1 e2) eval (Sub e1 e2) = n = (eval e1) + (eval e2) = (eval e1) - (eval e2) D. Rösner AuD I 2009/10 . . . 20 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Rekursive algebraische Typen cont. Beispiel: Bäume mit ganzen Zahlen data NTree = NilT | Node Int NTree NTree Beispiele für Funktionen: sumTree, depth :: NTree -> Int sumTree NilT = 0 sumTree (Node n t1 t2) = n + sumTree t1 + sumTree t2 ... D. Rösner AuD I 2009/10 . . . 21 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Beispiele für Funktionen: cont. ... depth NilT = 0 depth (Node n t1 t2) = 1 + max (depth t1)(depth t2) occurs :: NTree -> Int -> Int occurs NilT p = 0 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 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Polymorphe algebraische Typen: Definitionen algebraischer Typen können Typvariable a, b, ... enthalten (vgl. [Tho99], 14.3) Beispiel: data Pairs a = Pr a a einige Ausprägungen: Pr 47 11 :: Pairs Int Pr [] [42] :: Pairs [Int] Pr [] [] :: Pairs [a] D. Rösner AuD I 2009/10 . . . 24 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Polymorphe algebraische Typen: Definitionen algebraischer Typen können Typvariable a, b, ... enthalten (vgl. [Tho99], 14.3) der eingebaute Listentyp könnte wie folgt definiert sein: data List a = NilList | Cons a (List a) deriving (Eq, Ord, Show, Read) D. Rösner AuD I 2009/10 . . . 25 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: data Tree a = Nil | Node a (Tree a) (Tree a) deriving (Eq, Ord, Show, Read) Beispiel einer Funktion auf binären Bäumen: depth :: Tree a -> Int depth Nil = 0 depth (Node n t1 t2) = 1 + max (depth t1)(depth t2) D. Rösner AuD I 2009/10 . . . 26 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Binäre Bäume . . . aus Baum Liste ‘kollabieren’ bei Inorder-Traversierung collapse :: Tree a -> [a] collapse Nil = [] collapse (Node n t1 t2) = collapse t1 ++ [n] ++ collapse t2 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 . . . 27 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Binäre Bäume . . . mapTree als Funktion höherer Ordnung auf binären Bäumen mapTree :: (a -> b) -> Tree a -> Tree b mapTree f Nil = Nil mapTree f (Node n t1 t2) = Node (f n) (mapTree f t1) (mapTree f t2) D. Rösner AuD I 2009/10 . . . 28 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Algebraische Typen: für Produkttypen gibt es eine alternative Syntax: Beispiel: data Person’ = Person’ {name :: Name, age :: Age} deriving (Eq,Show,Read) type Name = String type Age = Int 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 . . . 30 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Algebraische Typen: Variante Instanzen werden kreiert mithilfe des Konstruktors und der benannten Selektoren Beispiel >p1 = Person’ {name = "Paul", age = 21} da der Selektor die jeweilige Komponente eindeutig benennt, ist die Reihenfolge der Angaben beliebig Beispiel >p2 = Person’ {age = 12, name = "Pauline"} D. Rösner AuD I 2009/10 . . . 31 Algebraische Typen 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 Beispiel Main> p1 Person’{name="Paul",age=21} Main> p2 Person’{name="Pauline",age=12} D. Rösner AuD I 2009/10 . . . 32 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Algebraische Typen: Variante mit den benannten Selektorfunktionen kann auf die Werte der Komponenten zugegriffen werden Beispiel: Main> name p1 "Paul" Main> age p2 12 D. Rösner AuD I 2009/10 . . . 33 Algebraische Typen Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Algebraische Typen: Variante Konstruktor und Selektoren können in Funktionen zur Modifikation von Instanzen verwendet werden Beispiel: hasBirthday :: Person’ -> Person’ hasBirthday p = Person’ {name= name p, age= age p + 1} D. Rösner AuD I 2009/10 . . . 34 Algebraische Typen 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: Main> p1 Person’{name="Paul",age=21} Main> hasBirthday p1 Person’{name="Paul",age=22} Main> p1 Person’{name="Paul",age=21} D. Rösner AuD I 2009/10 . . . 35 Algebraische Typen 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