Algorithmen und Datenstrukturen I

Werbung
Tupel in Haskell
Tupel in Haskell
Gliederung
Algorithmen und Datenstrukturen I
Tupel in Haskell
1
D. Rösner
Institut für Wissens- und Sprachverarbeitung
Fakultät für Informatik
Otto-von-Guericke Universität Magdeburg
Tupel in Haskell
Einleitung
Verwendung
Beispiel
c
Winter 2009/10, 19. Oktober 2009, 2009/10
D.Rösner
D. Rösner AuD I 2009/10 . . .
Tupel in Haskell
D. Rösner AuD I 2009/10 . . .
1
Einleitung
Verwendung
Beispiel
Tupel in Haskell
2
Einleitung
Verwendung
Beispiel
Tupel in Haskell:
Tupel in Haskell:
Aggregationstyp Tupel:
auch Tupel dienen – wie Listen – zum Zusammenfassen
von Daten zu einem Objekt
Beispiel: Studenten seien dargestellt durch Paare aus
Name (Typ String) und
Matrikelnummer (Typ Int)
in Tupeln wird
eine feste Anzahl von Objekten aggregiert,
die aber von unterschiedlichem Typ sein können
Definition des Tupeltyps Student
Beispiele:
type Student = (String,Int)
Paare . . . (<elem1>,<elem2>)
Tripel (oder: 3-Tupel) . . . (<elem1>,<elem2>,<elem3>)
n-Tupel . . . (<elem1>,<elem2>,...,<elemN>)
math. Sicht:
Tupeltyp als Teilmenge des Kreuzprodukts der
Komponententypen
Unterschied:
Liste aggregiert variable Anzahl von Objekten
mit identischem Typ
D. Rösner AuD I 2009/10 . . .
4
D. Rösner AuD I 2009/10 . . .
5
Tupel in Haskell
Einleitung
Verwendung
Beispiel
Tupel in Haskell
Verwendung von Tupeln (vgl. [Tho99], 5.2)
Einleitung
Verwendung
Beispiel
Funktionen mit Tupeln
Funktionen mit Tupeln
meist mit Pattern matching definiert
es gibt typische Verwendungen für Tupel:
Beispiel:
Tupel für zusammengesetzte Resultate von Funktionen
Beispiel:
addPair :: (Int, Int) -> Int
addPair (x,y) = x+y
minAndMax :: Int -> Int -> (Int, Int)
minAndMax x y
| x>=y
| otherwise
Variante mit vordefinierten Selektorfunktionen für Paare
= (y,x)
= (x,y)
addPair :: (Int, Int) -> Int
addPair p = fst p + snd p
D. Rösner AuD I 2009/10 . . .
Tupel in Haskell
7
Einleitung
Verwendung
Beispiel
D. Rösner AuD I 2009/10 . . .
Tupel in Haskell
Funktionen mit Tupeln
8
Einleitung
Verwendung
Beispiel
Beispiel: effiziente Berechnung der Fibonacci-Zahlen
(vgl. [Tho99], pp. 75])
mögliche Definition dieser Selektorfunktionen:
Idee: Funktion, die zwei aufeinanderfolgende Werte der
Folge als Resultat, d.h. gesucht ist
fst (x,y) = x
snd (x,y) = y
fibPair :: Int -> (Int, Int)
in Prelude.hs: mit wildcards in Muster
fst
fst (x,_)
:: (a,b) -> a
= x
snd
snd (_,y)
:: (a,b) -> b
= y
fibPair n = (fib n, fib (n+1))
aus einem Paar (u,v) ergibt sich das nachfolgende Paar
als (v,u+v) über fibStep
fibStep :: (Int, Int) -> (Int, Int)
D. Rösner AuD I 2009/10 . . .
fibStep (u,v) = (v,u+v)
9
D. Rösner AuD I 2009/10 . . .
11
Einleitung
Verwendung
Beispiel
Tupel in Haskell
Tupel in Haskell
Beispiel: effiziente Berechnung der Fibonacci-Zahlen
cont.
Funktionen mit Tupeln
damit fibPair definierbar als
bei Definition von Funktionen auf Tupeln können auch
verschachtelte Muster verwendet werden (vgl. [Tho99],
5.2)
fibPair :: Int -> (Int, Int)
fibPair n
| n== 0
| otherwise
Einleitung
Verwendung
Beispiel
Beispiel:
= (0,1)
= fibStep (fibPair (n-1))
shift :: ((Int,Int),Int) -> (Int,(Int,Int))
schliesslich: das erste Element des Paars ist das Ergebnis
shift ((x,y),z) = (x,(y,z))
fastFib :: Int -> Int
fastFib n = fst(fibPair n)
D. Rösner AuD I 2009/10 . . .
Tupel in Haskell
12
Einleitung
Verwendung
Beispiel
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 . . .
14
D. Rösner AuD I 2009/10 . . .
13
Herunterladen