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 • Unterschied: Liste aggregiert variable Anzahl von Objekten mit identischem Typ c Prof. Dr. D. Rösner; erstellt: 17. Oktober 2006 WS 2006/2007, Programmierkonzepte und Modellierung (PKM), 61 Verwendung von Tupeln (vgl. [S.Thompson, 1999, 5.2]) – Name (Typ String) und – Matrikelnummer (Typ Int) type Student = (String,Int) • math. Sicht: Tupeltyp als Teilmenge des Kreuzprodukts der Komponententypen c Prof. Dr. D. Rösner; erstellt: 17. Oktober 2006 WS 2006/2007, Programmierkonzepte und Modellierung (PKM), 62 Funktionen mit Tupeln • Tupel für zusammengesetzte Resultate von Funktionen; Beispiel: • meist mit Pattern matching definiert; Beispiel: minAndMax :: Int -> Int -> (Int, Int) minAndMax x y | x>=y | otherwise • Beispiel: Studenten seien dargestellt durch Paare aus addPair :: (Int, Int) -> Int addPair (x,y) = x+y = (y,x) = (x,y) • Variante mit vordefinierten Selektorfunktionen für Paare addPair :: (Int, Int) -> Int addPair p = fst p + snd p c Prof. Dr. D. Rösner; erstellt: 17. Oktober 2006 WS 2006/2007, Programmierkonzepte und Modellierung (PKM), 63 c Prof. Dr. D. Rösner; erstellt: 17. Oktober 2006 WS 2006/2007, Programmierkonzepte und Modellierung (PKM), 64 Funktionen mit Tupeln Beispiel: effiziente Berechnung der Fibonacci-Zahlen (vgl. [S.Thompson, 1999, 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 n = (fib n, fib (n+1)) • in Prelude.hs: mit wildcards in Muster fst fst (x,_) :: (a,b) -> a = x snd snd (_,y) :: (a,b) -> b = y c Prof. Dr. D. Rösner; erstellt: 17. Oktober 2006 WS 2006/2007, Programmierkonzepte und Modellierung (PKM), • aus einem Paar (u,v) ergibt sich das nachfolgende als (v,u+v) über fibStep fibStep :: (Int, Int) -> (Int, Int) fibStep (u,v) = (v,u+v) 65 Beispiel: effiziente Berechnung der Fibonacci-Zahlen cont. c Prof. Dr. D. Rösner; erstellt: 17. Oktober 2006 WS 2006/2007, Programmierkonzepte und Modellierung (PKM), 66 Funktionen mit Tupeln bei Definition von Funktionen auf Tupeln können auch verschachtelte Muster verwendet werden (vgl. [S.Thompson, 1999, 5.2]) • damit fibPair definierbar als fibPair :: Int -> (Int, Int) fibPair n | n== 0 = (0,1) | otherwise = fibStep (fibPair (n-1)) shift :: ((Int,Int),Int) -> (Int,(Int,Int)) shift ((x,y),z) = (x,(y,z)) • schliesslich: das erste Element des Paars ist das Ergebnis fastFib :: Int -> Int fastFib = fst . fibPair c Prof. Dr. D. Rösner; erstellt: 17. Oktober 2006 WS 2006/2007, Programmierkonzepte und Modellierung (PKM), 67 c Prof. Dr. D. Rösner; erstellt: 17. Oktober 2006 WS 2006/2007, Programmierkonzepte und Modellierung (PKM), 68