Funktionale Abstraktion: Beispiele rekursiv definierter Funktionen

Werbung
Funktionale Abstraktion:
Beispiele rekursiv definierter Funktionen cont.
Beispiele rekursiv definierter Funktionen (vgl. [Rabhi & Lapalme, 1999,
1.2.2])
• Summe der natürlichen Zahlen bis n
• Fakultätsfunktion
fact n | n == 0
| n > 0
• ...
sumInt n | n == 0
| n > 0
= 1
= n * fact(n-1)
= 0
= n + sumInt(n-1)
• Summe der Quadrate der natürlichen Zahlen bis n
• ...
sumSqr n | n == 0
| n > 0
c Prof. Dr. D. Rösner; erstellt: 23. April 2007
Sommer 2007, Programmierparadigmen (PGP), 69
Beispiele . . . cont.
= 0
= n*n + sumSqr(n-1)
c Prof. Dr. D. Rösner; erstellt: 23. April 2007
Sommer 2007, Programmierparadigmen (PGP), 70
Darstellung dieser Abstraktion in Haskell
das den obigen Beispielen zugrundeliegende Rekursionsprinzip kann wie
folgt abstrahiert werden:
• es wird Funktionswert für die Basis (d.h. für n == 0) definiert
induction base comb n
| n == 0 = base
| n > 0 = comb n (induction base comb (n-1))
Frage: Typ von induction ?
• der Funktionswert für n ergibt sich durch Kombination von n (bzw. eines
aus n berechneten Werts) mit dem Funktionswert für (n-1)
• m.a.W.: der Rekursionsschritt wird als Anwendung einer zweistelligen
Kombinationsfunktion auf n und Funktionswert für (n-1) realisiert
c Prof. Dr. D. Rösner; erstellt: 23. April 2007
Sommer 2007, Programmierparadigmen (PGP), 71
c Prof. Dr. D. Rösner; erstellt: 23. April 2007
Sommer 2007, Programmierparadigmen (PGP), 72
Abstraktion: induction
Abstraktion: induction
• induction ist Funktion höherer Ordnung (nimmt eine Funktion als Argument; hier: comb)
• damit Darstellung von fact bzw. sumInt mit Hilfe von induction und
der vordefinierten Funktionen (+) bzw. (*)
> fact n = induction 1 (*) n
> sumInt n = induction 0 (+) n
c Prof. Dr. D. Rösner; erstellt: 23. April 2007
Sommer 2007, Programmierparadigmen (PGP), 73
Benannte vs. anonyme Funktionen
> fact = induction 1 (*)
> sumInt = induction 0 (+)
• die rechten Seiten dieser Gleichungen zeigen sog. partielle Anwendungen
von mehrstelligen Funktionen
c Prof. Dr. D. Rösner; erstellt: 23. April 2007
Sommer 2007, Programmierparadigmen (PGP), 74
Benannte vs. anonyme Funktionen
• die Kombinationsfunktion für sumSqr könnte benannt definiert werden,
z.B.
f x y = x*x + y
• dann:
• alternativ: Kombinationsfunktion als sog. anonyme Funktion
• Syntax in Anlehnung an den λ-Kalkül mit (λxy.x ∗ x + y):
sumSqr n = induction 0 (\x y -> x*x + y) n
> sumSqr n = induction 0 f n
bzw.
> sumSqr = induction 0 f
c Prof. Dr. D. Rösner; erstellt: 23. April 2007
Sommer 2007, Programmierparadigmen (PGP), • alternativ: Definition auf Funktionsebene möglich, d.h.
bzw.
sumSqr = induction 0 (\x y -> x*x + y)
75
c Prof. Dr. D. Rösner; erstellt: 23. April 2007
Sommer 2007, Programmierparadigmen (PGP), 76
Herunterladen