Eine Higher-Order-Funktion (Funktion höherer Ordnung) ist eine Funktion, die andere Funktionen als Argumente entgegennimmt, eine Funktion als Ergebnis zurückgibt — oder beides. Voraussetzung sind First-Class-Funktionen: Funktionen werden behandelt wie Zahlen oder Strings, also als normale Werte, die man speichern, übergeben und zurückgeben kann.
Die Klassiker: map, filter, reduce
Die bekanntesten Higher-Order-Funktionen verarbeiten Listen oder Arrays:
# Python
zahlen = [1, 2, 3, 4]
quadrate = list(map(lambda x: x*x, zahlen)) # [1, 4, 9, 16]
gerade = list(filter(lambda x: x % 2 == 0, zahlen)) # [2, 4]
summe = reduce(lambda a, b: a + b, zahlen) # 10
In JavaScript stehen dieselben Ideen als Array-Methoden bereit: map(), filter(), reduce(). Statt Schleifen manuell zu schreiben, beschreibt man was mit den Elementen geschehen soll — die Higher-Order-Funktion übernimmt den Kontrollfluss.
Weitere Beispiele
sort()nimmt eine Vergleichsfunktion entgegen und erlaubt beliebige Sortierreihenfolgen.- Event-Handler und Listener sind Funktionen, die an ein Ereignis „angehängt“ werden.
- Decorators und Middleware (etwa in Web-Frameworks) wickeln Funktionen in zusätzliche Logik ein.
debounceundthrottlegeben eine neue Funktion zurück, die Aufrufe zeitlich begrenzt.
Warum nützlich?
Higher-Order-Funktionen abstrahieren wiederkehrende Abläufe. Statt denselben Schleifen-Code zu duplizieren, schreibt man eine generische Funktion einmal und steckt die spezifische Logik als Parameter hinein. Das fördert Wiederverwendung, Lesbarkeit und Komposition — zentrale Ziele der funktionalen Programmierung.
Zusammenhänge
- Ein Callback ist die konkrete Funktion, die an eine Higher-Order-Funktion übergeben wird.
- Currying erzeugt Higher-Order-Funktionen, weil jeder Zwischenschritt eine Funktion zurückgibt.
- Gemeinsam mit Immutability entstehen kleine, reine Bausteine, die sich gefahrlos kombinieren lassen.
- Die Idee reicht bis in den Lambda-Kalkül zurück, wo Funktionen die einzigen Werte sind.