Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Gliederung Algorithmen und Datenstrukturen – Einführung Algebraische Typen 1 Einleitung 2 Typsynonyme 3 Algebraische Typen Aufzählungstypen Produkttypen Rekursive algebraische Typen 4 Polymorphie 5 Variante D. Rösner Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg Winter 2008/2009, 16. November 2008 D. Rösner AuD 2008/2009 . . . Einleitung Typsynonyme Algebraische Typen Polymorphie Variante D. Rösner AuD 2008/2009 . . . 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])]]) 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 damit lassen sich viele Beziehungen modellieren D. Rösner AuD 2008/2009 . . . D. Rösner AuD 2008/2009 . . . Einleitung Typsynonyme Algebraische Typen Polymorphie Variante 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) Typsynonyme zur Modellierung: Typsynonyme können – wie Typen – in Signaturen verwendet werden Beispiel: Typsynonym Student um Komponente für Semesterzahl erweitert Beispiel type type type type Student = (Name, Matrnr, Semester) Name = String Matrnr = Int Semester = Int Funktion rueckmelden, die Semesterzahl erhöht Beispiel rueckmelden :: Student -> Student D. Rösner AuD 2008/2009 . . . Einleitung Typsynonyme Algebraische Typen Polymorphie Variante 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 Beispiel: Definition von Instanzen stud1 = ("Mueller", 1234567, 3)::Student stud2 = ("Meier", 2345678, 1)::Student 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 Beispiele einer Interaktion Main> stud1 ("Mueller",1234567,3) Main> rueckmelden stud1 ("Mueller",1234567,4) Main> stud1 ("Mueller",1234567,3) D. Rösner D. Rösner sem) AuD 2008/2009 ... rueckmelden (name, matr, = (name, matr, sem+1) Main> :t map (rueckmelden.rueckmelden) [stud1, stud2] map (rueckmelden . rueckmelden) [stud1,stud2] :: [([Char],Int,Int)] AuD 2008/2009 . . . D. Rösner AuD 2008/2009 . . . Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Aufzählungstypen Produkttypen Rekursive algebraische Typen Aufzählungstypen Produkttypen Rekursive algebraische Typen Typen 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 == _ == D. Rösner Einleitung Typsynonyme Algebraische Typen Polymorphie Variante AuD 2008/2009 . . . Aufzählungstypen Produkttypen Rekursive algebraische Typen Produkttypen als algebraische Typen Typen mit Komponenten (sog. Produkttypen) als algebraische Typen Beispiel: data People = Person Name Age type Name = String type Age = Int Cold Hot _ = True = True = False D. Rösner Einleitung Typsynonyme Algebraische Typen Polymorphie Variante AuD 2008/2009 . . . Aufzählungstypen Produkttypen Rekursive algebraische Typen 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 Beispiele: Person "Hans Mueller" 42 Person "Bart Simpson" 12 D. Rösner AuD 2008/2009 . . . D. Rösner AuD 2008/2009 . . . Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Aufzählungstypen Produkttypen Rekursive algebraische Typen 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 Einleitung Typsynonyme Algebraische Typen Polymorphie Variante AuD 2008/2009 . . . Aufzählungstypen Produkttypen Rekursive algebraische Typen 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 2008/2009 . . . Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Aufzählungstypen Produkttypen Rekursive algebraische Typen 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 Einleitung Typsynonyme Algebraische Typen Polymorphie Variante AuD 2008/2009 . . . Aufzählungstypen Produkttypen Rekursive algebraische Typen 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) D. Rösner = n = (eval e1) + (eval e2) = (eval e1) - (eval e2) AuD 2008/2009 . . . Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Aufzählungstypen Produkttypen Rekursive algebraische Typen Rekursive algebraische Typen cont. Aufzählungstypen Produkttypen Rekursive algebraische Typen Beispiele für Funktionen: cont. ... Beispiel: Bäume mit ganzen Zahlen data NTree = NilT | Node Int NTree NTree Beispiele für Funktionen: depth NilT = 0 depth (Node n t1 t2) = 1 + max (depth t1)(depth t2) sumTree, depth :: NTree -> Int occurs :: NTree -> Int -> Int sumTree NilT = 0 sumTree (Node n t1 t2) = n + sumTree t1 + sumTree t2 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 D. Rösner AuD 2008/2009 . . . Einleitung Typsynonyme Algebraische Typen Polymorphie Variante 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] 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 2008/2009 . . . AuD 2008/2009 . . . Binäre Bäume als polymorphe algebraische Typen die Elemente in den Knoten können von bel. Typ sein Beispiel: data Tree a = Nil | Node a (Tree a) (Tree a) deriving (Eq, Ord, Show, Read) Beispiel: depth :: Tree a -> Int depth Nil = 0 depth (Node n t1 t2) = 1 + max (depth t1)(depth t2) D. Rösner AuD 2008/2009 . . . Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Binäre Bäume . . . Binäre Bäume . . . aus Baum Liste ‘kollabieren’ bei Inorder-Traversierung collapse collapse collapse = :: Tree a -> [a] Nil = [] (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 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) AuD 2008/2009 . . . D. Rösner Einleitung Typsynonyme Algebraische Typen Polymorphie Variante AuD 2008/2009 . . . Einleitung Typsynonyme Algebraische Typen Polymorphie Variante Algebraische Typen: Algebraische Typen: Variante 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 Beispiel >p1 = Person’ {name = "Paul", age = 21} 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 Instanzen werden kreiert mithilfe des Konstruktors und der benannten Selektoren AuD 2008/2009 . . . Beispiel >p2 = Person’ {age = 12, name = "Pauline"} D. Rösner AuD 2008/2009 . . . Einleitung Typsynonyme Algebraische Typen Polymorphie Variante 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 Algebraische Typen: Variante mit den benannten Selektorfunktionen kann auf die Werte der Komponenten zugegriffen werden Beispiel: Main> name p1 "Paul" Main> age p2 12 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} AuD 2008/2009 . . . D. Rösner Einleitung Typsynonyme Algebraische Typen Polymorphie Variante AuD 2008/2009 . . . 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} Literatur: 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. Main> p1 Person’{name="Paul",age=21} D. Rösner AuD 2008/2009 . . . D. Rösner AuD 2008/2009 . . .