Algebraische Typen - Otto-von-Guericke

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