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