Funktionen höherer Ordnung
Funktionen die Funktionen verarbeiten
Um einige Probleme elegant zu lösen, kann es hilfreich sein Funktionen zu entwerfen, die selbst Funktionen als Übergabedaten erhalten oder Funktionen als Rückgabe liefern. In der Funktionalen Programmierung ist das ganz natürlich möglich, wir können Funktionen hier wie jeden anderen Datentyp behandeln.
Aufgabe 1: Bekannte Funktionen höherer Ordnung
(a) Betrachte die in dieser Datei verwendeten bzw. definierten Funktionen. Sammle sämtliche Funktionen höherer Ordnung die du findest.
(b) Begründe warum Funktionen höherer Ordnung bei der Anwendung auf Listen besonders nützlich sind.
Aufgabe 2: Signaturen von Funktionen höherer Ordnung
Ob es sich bei einer Funktion um eine Funktion höherer Ordnung handelt, wird anhand
der Funktionssignatur direkt ersichtlich.
Betrachten wir unsere Funktion Infix
mit einer zulässigen Signatur:
(: infix (real (real real -> real) real -> real))
(define infix
(lambda (x f y)
(f x y)))
(a) Woran erkennst du in der Signatur, dass es sich um eine Funktion höherer Ordnung handelt?
(b) Teste und begründe welche der folgenden drei Aufrufe anhand der obigen Signatur zulässig sind.
> (infix -18.2 max -20)
> (infix "Hallo " string-append "Welt!")
> (infix 14 < 13)
(c) Passe die Signatur so an, dass diese für sämtliche der drei Ausdrücke zulässig ist.
Tipp: Wenn du dir unsicher bist, schau dir die Signaturen von Listenfunktionen
nochmals an.
(d) Ergänze die Signaturen für deine in diesem Kapitel erstellten Funktionen höherer Ordnung.