Das Konzept des Tuplings steht eng in Verbindung mit dem Konzept der Parameter Akkumulation. Anstatt eines zusätzlichen Parameters wird
ein zusätzliches Ergebnis eingeführt. Wir nutzen das zusätzliche Ergebnis, um Berechnungen miteinander in Verbindung zu bringen und
vorangegangene Ergebnisse zur Berechnung nachfolgender zu nutzen.
statt:
01 fib :: Integer -> Integer
|
wird diese Definition von fib genutzt:
01 fib :: Integer -> (Integer, Integer)
|
Wie in der Idee des Tuplings schon angesprochen, werden wir uns jetzt mit den Fibonacci-Zahlen befassen. Die erste, schon bekannte, Definition der
Fibonacci-Zahlen ist:
01 fib :: Integer -> Integer
02 fib 0 = 0
03 fib 1 = 1
04 fib (n+2) = fib n + fib(n+1)
|
In diesem Beispiel werden wir nur einen moderaten Laufzeitgewinn erzielen. Vielmehr wird schon ein wichtiges Thema des letzten Kapitels angesprochen,
die Speichplatzkomplexität von Listen. Stellen wir uns vor, wir müssen den Durchschnittswert einer Float-Liste ermitteln. Dazu benötigen wir die Summe
aller Elemente und die Länge der Liste.
01 average :: [Float] -> Float
02 average xs = (sum xs) / (length xs)
|
Die obige Definition stellt das einfachste Verfahren vor. Wir berechnen Summe und Länge der Liste sequentiell und berechnen dann das Ergebnis.
Dazu sind zwei Traversierungen der Liste nötig. Mit der Tupling-Technik können wir die Anzahl der Traversierungen auf eine reduzieren. Definieren
wir eine Funktion sumlen die Summe und Länge einer Liste in einem Ergebnistupel zurückgibt.
01 sumlen xs = (sum xs, length xs)
|