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