Algebraische Typen - Otto-von-Guericke

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