Currying (in der Linguistik auch Schönfinkeln genannt) ist die Umwandlung einer Funktion mit mehreren Argumenten in eine Kette von Funktionen, die jeweils genau ein Argument entgegennehmen. Statt f(a, b) schreibt man f(a)(b): Der Aufruf mit dem ersten Argument liefert eine neue Funktion, die auf das zweite Argument wartet.
Herkunft und Name
Das Verfahren geht auf den Logiker Moses Schönfinkel (1924) zurück und wurde später von Haskell Curry aufgegriffen — nach ihm ist die Technik benannt. Auch Gottlob Frege hatte die Idee bereits vorweggenommen. Currying ist ein Kernkonzept der Lambda-Kalkül-basierten Sicht auf Funktionen.
Beispiel
In Haskell ist Currying die Standardform — jede Funktion ist eigentlich einstellig:
add :: Int -> Int -> Int
add x y = x + y
add3 = add 3 -- teil-appliziert: wartet auf das zweite Argument
add3 4 -- Ergebnis: 7
In JavaScript lässt sich Currying direkt als Kette von Pfeilfunktionen schreiben:
const add = a => b => a + b;
add(3)(4); // 7
const add3 = add(3);
add3(4); // 7
Currying und partielle Applikation
Currying zerlegt eine n-stellige Funktion in n einstellige Funktionen. Die partielle Applikation dagegen belegt nur einen Teil der Argumente vor und lässt den Rest offen — beide Techniken basieren auf Closures und sind eng verwandt, aber nicht identisch. Currying erleichtert Wiederverwendung und Funktionskomposition: einmal gebaute Zwischenfunktionen lassen sich an vielen Stellen einsetzen.
Zusammenhang mit funktionalen Konzepten
- Currying erzeugt Higher-Order-Funktionen: Die zurückgegebene Funktion ist selbst ein Wert.
- Zusammen mit Immutability entsteht der typische funktionale Stil: kleine, reine Bausteine statt veränderlichem Zustand.
- Currying ist ein Standard-Werkzeug der funktionalen Programmierung und wird in Haskell-Befehle ebenso genutzt wie in modernem JavaScript.