Algorithmen und Datenstrukturen -- Einführung

Werbung
Einleitung
Verwendung
Beispiel
Einleitung
Verwendung
Beispiel
Gliederung
Algorithmen und Datenstrukturen – Einführung
Tupel in Haskell
D. Rösner
Institut für Wissens- und Sprachverarbeitung
Fakultät für Informatik
Otto-von-Guericke Universität Magdeburg
1
Einleitung
2
Verwendung
3
Beispiel
Winter 2008/2009, 23. Oktober 2008
D. Rösner
D. Rösner
AuD 2008/2009 . . .
Einleitung
Verwendung
Beispiel
AuD 2008/2009 . . .
Einleitung
Verwendung
Beispiel
Tupel in Haskell:
Tupel in Haskell:
Aggregationstyp Tupel:
auch Tupel dienen – wie Listen – zum Zusammenfassen
von Daten zu einem Objekt
in Tupeln wird
eine feste Anzahl von Objekten aggregiert,
die aber von unterschiedlichem Typ sein können
Beispiele:
Beispiel: Studenten seien dargestellt durch Paare aus
Name (Typ String) und
Matrikelnummer (Typ Int)
Definition des Tupeltyps Student
type Student = (String,Int)
Paare . . . (<elem1>,<elem2>)
Tripel (oder: 3-Tupel) . . . (<elem1>,<elem2>,<elem3>)
n-Tupel . . . (<elem1>,<elem2>,...,<elemN>)
Unterschied:
math. Sicht:
Tupeltyp als Teilmenge des Kreuzprodukts der
Komponententypen
Liste aggregiert variable Anzahl von Objekten
mit identischem Typ
D. Rösner
AuD 2008/2009 . . .
D. Rösner
AuD 2008/2009 . . .
Einleitung
Verwendung
Beispiel
Einleitung
Verwendung
Beispiel
Verwendung von Tupeln (vgl. [Tho99], 5.2)
Funktionen mit Tupeln
Funktionen mit Tupeln
es gibt typische Verwendungen für Tupel:
Tupel für zusammengesetzte Resultate von Funktionen
Beispiel:
minAndMax :: Int -> Int -> (Int, Int)
minAndMax x y
| x>=y
| otherwise
= (y,x)
= (x,y)
meist mit Pattern matching definiert
Beispiel:
addPair :: (Int, Int) -> Int
addPair (x,y) = x+y
Variante mit vordefinierten Selektorfunktionen für Paare
addPair :: (Int, Int) -> Int
addPair p = fst p + snd p
D. Rösner
AuD 2008/2009 . . .
Einleitung
Verwendung
Beispiel
D. Rösner
AuD 2008/2009 . . .
Einleitung
Verwendung
Beispiel
Beispiel: effiziente Berechnung der Fibonacci-Zahlen
(vgl. [Tho99], pp. 75])
Funktionen mit Tupeln
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 2008/2009 . . .
fibStep (u,v) = (v,u+v)
D. Rösner
AuD 2008/2009 . . .
Einleitung
Verwendung
Beispiel
Einleitung
Verwendung
Beispiel
Beispiel: effiziente Berechnung der Fibonacci-Zahlen
cont.
damit fibPair definierbar als
fibPair :: Int -> (Int, Int)
fibPair n
| n== 0
| otherwise
= (0,1)
= fibStep (fibPair (n-1))
Funktionen mit Tupeln
bei Definition von Funktionen auf Tupeln können auch
verschachtelte Muster verwendet werden (vgl. [Tho99],
5.2)
Beispiel:
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 2008/2009 . . .
Einleitung
Verwendung
Beispiel
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.
D. Rösner
AuD 2008/2009 . . .
D. Rösner
AuD 2008/2009 . . .
Herunterladen