Tupel in Haskell Programmierparadigmen Tupel in Haskell D. Rösner Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg c Sommer 2011, 11. April 2011, 2011 D.Rösner D. Rösner PGP 2011 . . . 1 Tupel in Haskell Gliederung 1 Tupel in Haskell Einleitung Verwendung Beispiel D. Rösner PGP 2011 . . . 2 Tupel in Haskell Einleitung Verwendung Beispiel Gliederung 1 Tupel in Haskell Einleitung Verwendung Beispiel D. Rösner PGP 2011 . . . 3 Tupel in Haskell Einleitung Verwendung Beispiel Tupel in Haskell: Aggregationstyp Tupel: D. Rösner PGP 2011 . . . 4 Tupel in Haskell Einleitung Verwendung Beispiel Tupel in Haskell: Aggregationstyp Tupel: auch Tupel dienen – wie Listen – zum Zusammenfassen von Daten zu einem Objekt D. Rösner PGP 2011 . . . 4 Tupel in Haskell Einleitung Verwendung Beispiel Tupel in Haskell: Aggregationstyp Tupel: auch Tupel dienen – wie Listen – zum Zusammenfassen von Daten zu einem Objekt in Tupeln wird D. Rösner PGP 2011 . . . 4 Tupel in Haskell Einleitung Verwendung Beispiel 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, D. Rösner PGP 2011 . . . 4 Tupel in Haskell Einleitung Verwendung Beispiel 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 D. Rösner PGP 2011 . . . 4 Tupel in Haskell Einleitung Verwendung Beispiel 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: D. Rösner PGP 2011 . . . 4 Tupel in Haskell Einleitung Verwendung Beispiel 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: Paare . . . (<elem1>,<elem2>) D. Rösner PGP 2011 . . . 4 Tupel in Haskell Einleitung Verwendung Beispiel 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: Paare . . . (<elem1>,<elem2>) Tripel (oder: 3-Tupel) . . . (<elem1>,<elem2>,<elem3>) D. Rösner PGP 2011 . . . 4 Tupel in Haskell Einleitung Verwendung Beispiel 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: Paare . . . (<elem1>,<elem2>) Tripel (oder: 3-Tupel) . . . (<elem1>,<elem2>,<elem3>) n-Tupel . . . (<elem1>,<elem2>,...,<elemN>) D. Rösner PGP 2011 . . . 4 Tupel in Haskell Einleitung Verwendung Beispiel 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: Paare . . . (<elem1>,<elem2>) Tripel (oder: 3-Tupel) . . . (<elem1>,<elem2>,<elem3>) n-Tupel . . . (<elem1>,<elem2>,...,<elemN>) Unterschied: D. Rösner PGP 2011 . . . 4 Tupel in Haskell Einleitung Verwendung Beispiel 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: Paare . . . (<elem1>,<elem2>) Tripel (oder: 3-Tupel) . . . (<elem1>,<elem2>,<elem3>) n-Tupel . . . (<elem1>,<elem2>,...,<elemN>) Unterschied: Liste aggregiert variable Anzahl von Objekten D. Rösner PGP 2011 . . . 4 Tupel in Haskell Einleitung Verwendung Beispiel 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: Paare . . . (<elem1>,<elem2>) Tripel (oder: 3-Tupel) . . . (<elem1>,<elem2>,<elem3>) n-Tupel . . . (<elem1>,<elem2>,...,<elemN>) Unterschied: Liste aggregiert variable Anzahl von Objekten mit identischem Typ D. Rösner PGP 2011 . . . 4 Tupel in Haskell Einleitung Verwendung Beispiel Tupel in Haskell: Beispiel: Studenten seien dargestellt durch Paare aus D. Rösner PGP 2011 . . . 5 Tupel in Haskell Einleitung Verwendung Beispiel Tupel in Haskell: Beispiel: Studenten seien dargestellt durch Paare aus Name (Typ String) und D. Rösner PGP 2011 . . . 5 Tupel in Haskell Einleitung Verwendung Beispiel Tupel in Haskell: Beispiel: Studenten seien dargestellt durch Paare aus Name (Typ String) und Matrikelnummer (Typ Int) D. Rösner PGP 2011 . . . 5 Tupel in Haskell Einleitung Verwendung Beispiel Tupel in Haskell: Beispiel: Studenten seien dargestellt durch Paare aus Name (Typ String) und Matrikelnummer (Typ Int) Definition des Tupeltyps Student type Student = (String,Int) D. Rösner PGP 2011 . . . 5 Tupel in Haskell Einleitung Verwendung Beispiel Tupel in Haskell: Beispiel: Studenten seien dargestellt durch Paare aus Name (Typ String) und Matrikelnummer (Typ Int) Definition des Tupeltyps Student type Student = (String,Int) math. Sicht: D. Rösner PGP 2011 . . . 5 Tupel in Haskell Einleitung Verwendung Beispiel Tupel in Haskell: Beispiel: Studenten seien dargestellt durch Paare aus Name (Typ String) und Matrikelnummer (Typ Int) Definition des Tupeltyps Student type Student = (String,Int) math. Sicht: Tupeltyp als Teilmenge des Kreuzprodukts der Komponententypen D. Rösner PGP 2011 . . . 5 Tupel in Haskell Einleitung Verwendung Beispiel Gliederung 1 Tupel in Haskell Einleitung Verwendung Beispiel D. Rösner PGP 2011 . . . 6 Tupel in Haskell Einleitung Verwendung Beispiel Verwendung von Tupeln (vgl. [Tho99], 5.2) es gibt typische Verwendungen für Tupel: D. Rösner PGP 2011 . . . 7 Tupel in Haskell Einleitung Verwendung Beispiel Verwendung von Tupeln (vgl. [Tho99], 5.2) es gibt typische Verwendungen für Tupel: Tupel für zusammengesetzte Resultate von Funktionen D. Rösner PGP 2011 . . . 7 Tupel in Haskell Einleitung Verwendung Beispiel Verwendung von Tupeln (vgl. [Tho99], 5.2) 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) D. Rösner PGP 2011 . . . 7 Tupel in Haskell Einleitung Verwendung Beispiel Funktionen mit Tupeln Funktionen mit Tupeln D. Rösner PGP 2011 . . . 8 Tupel in Haskell Einleitung Verwendung Beispiel Funktionen mit Tupeln Funktionen mit Tupeln meist mit Pattern matching definiert D. Rösner PGP 2011 . . . 8 Tupel in Haskell Einleitung Verwendung Beispiel Funktionen mit Tupeln Funktionen mit Tupeln meist mit Pattern matching definiert Beispiel: addPair :: (Int, Int) -> Int addPair (x,y) = x+y D. Rösner PGP 2011 . . . 8 Tupel in Haskell Einleitung Verwendung Beispiel Funktionen mit Tupeln Funktionen mit Tupeln 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 PGP 2011 . . . 8 Tupel in Haskell Einleitung Verwendung Beispiel Funktionen mit Tupeln mögliche Definition dieser Selektorfunktionen: fst (x,y) = x snd (x,y) = y D. Rösner PGP 2011 . . . 9 Tupel in Haskell Einleitung Verwendung Beispiel Funktionen mit Tupeln mögliche Definition dieser Selektorfunktionen: fst (x,y) = x snd (x,y) = y in Prelude.hs: mit wildcards in Muster fst fst (x,_) :: (a,b) -> a = x snd snd (_,y) :: (a,b) -> b = y D. Rösner PGP 2011 . . . 9 Tupel in Haskell Einleitung Verwendung Beispiel Gliederung 1 Tupel in Haskell Einleitung Verwendung Beispiel D. Rösner PGP 2011 . . . 10 Tupel in Haskell Einleitung Verwendung Beispiel Beispiel: effiziente Berechnung der Fibonacci-Zahlen (vgl. [Tho99], pp. 75]) Idee: Funktion, die zwei aufeinanderfolgende Werte der Folge als Resultat, d.h. gesucht ist fibPair :: Int -> (Int, Int) fibPair n = (fib n, fib (n+1)) D. Rösner PGP 2011 . . . 11 Tupel in Haskell Einleitung Verwendung Beispiel Beispiel: effiziente Berechnung der Fibonacci-Zahlen (vgl. [Tho99], pp. 75]) Idee: Funktion, die zwei aufeinanderfolgende Werte der Folge als Resultat, d.h. gesucht ist fibPair :: Int -> (Int, Int) 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) fibStep (u,v) = (v,u+v) D. Rösner PGP 2011 . . . 11 Tupel in Haskell 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)) D. Rösner PGP 2011 . . . 12 Tupel in Haskell 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)) schliesslich: das erste Element des Paars ist das Ergebnis fastFib :: Int -> Int fastFib n = fst(fibPair n) D. Rösner PGP 2011 . . . 12 Tupel in Haskell Einleitung Verwendung Beispiel Funktionen mit Tupeln bei Definition von Funktionen auf Tupeln können auch verschachtelte Muster verwendet werden (vgl. [Tho99], 5.2) D. Rösner PGP 2011 . . . 13 Tupel in Haskell Einleitung Verwendung Beispiel 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)) shift ((x,y),z) = (x,(y,z)) D. Rösner PGP 2011 . . . 13 Tupel in Haskell Einleitung Verwendung Beispiel Literatur: I Graham Hutton. Programming in Haskell. Cambridge University Press, 2006. ISBN 0521692695. 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 PGP 2011 . . . 14