Algorithmen und Datenstrukturen -- Einführung

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