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