Tupel in Haskell: Tupel in Haskell: Verwendung von Tupeln (vgl. [S

Werbung
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
Herunterladen