Überblick
Currying bezeichnet die systematische Umformung einer Funktion, die mehrere Argumente erwartet, in eine Kette von Funktionen, die jeweils genau ein Argument aufnehmen. Eine Funktion f(x,y) wird so zu g(x)(y). Diese Idee spielt eine Rolle in Mathematik und Informatik und ist nach dem Logiker Haskell B. Curry benannt, obwohl die historischen Wurzeln weiter zurückreichen.
Begriffliche Eigenschaften
Formal ist Currying eine bijektive Umformung des Typs: eine Funktion von (A×B)→C entspricht einer Funktion A→(B→C). In der Lambda-Kalkulation lässt sich Currying als syntaktische Technik ausdrücken; entsprechende Prinzipien finden sich in der Theorie der Typen und in der Funktionalprogrammierung. Eine charakteristische Eigenschaft ist, dass curry(f) eine Folge von einstelligen Funktionen liefert, die schrittweise angewandt werden können.
Abgrenzung und verwandte Konzepte
Currying wird oft mit partieller Anwendung verwechselt. Beim Currying wird die Struktur der Funktion transformiert; partielle Anwendung fixiert einzelne Argumente einer gegebenen Funktion. Das Umkehren nennt man Uncurrying. Für Hintergrund zur formalen Herkunft siehe Schönfinkel und Frege und zur symbolischen Darstellung Lambda-Kalkül.
Praxisbeispiele und Nutzen
In Programmiersprachen, die Funktionen als erste Klasse behandeln, vereinfacht Currying das Kombinieren und Wiederverwenden von Funktionen. In Haskell oder ML, die häufig standardmäßig kurrierte Funktionen verwenden, kann man etwa eine Additionsfunktion add :: Int -> Int -> Int als Funktion verstehen, die erst ein Int nimmt und dann ein weiteres liefert. Currying erleichtert die Punkt-freie Programmierung, das Erzeugen von spezialisierten Funktionen und das Komponieren von Operationen.
Historische Hinweise und Entwicklung
Die Begriffe gehen auf Arbeiten von Gottlob Frege und Moses Schönfinkel zurück; Haskell Curry trug später zur Formalisierung und Verbreitung bei, sodass sein Name am Konzept haftete. Moderne Programmiersprachen und Typentheorien nutzen Currying als grundlegende Transformation.
Wichtige praktische Hinweise
- Currying ändert die Aufrufkonvention: statt f(a,b) nutzt man curry(f)(a)(b).
- Performance: Implementierungen können Unterschiede in Effizienz und Speicherverbrauch zeigen.
- In vielen Sprachen kann man Currying simulieren oder explizit bereitstellen; Informationen zu konkreten Sprachbeispielen finden sich bei Programmiersprachen und allgemeinen Erklärungen zu Funktionsumwandlungen unter Funktionstransformation.
Weitere Vertiefungen und mathematische Details sind in Lehrbüchern zur Lambda-Kalkulation und zur funktionalen Programmierung zu finden; zusätzliche Ressourcen: Mathematik, Informatik, Currying-Praxis, historische Quellen, theoretische Grundlagen, Sprachbeispiele.