Currying is een techniek uit de wiskunde en de informatica waarbij een functie met meerdere argumenten wordt veranderd in een aantal functies met elk één argument. De wiskundigen Moses Schönfinkel en Gottlob Frege legden de basis voor deze techniek, die genoemd is naar Haskell Brooks Curry. Curry wordt gebruikt in Lambda calculus. Sommige programmeertalen, zoals ML en Haskell zeggen dat functies slechts één argument kunnen hebben.

Wat is currying precies?

In eenvoudige woorden: currying zet een functie van meerdere parameters om in een keten van functies die telkens één parameter accepteren. Als je een functie f hebt die twee argumenten neemt, f(x, y), dan produceert currying een functie g zodat g(x) terugkeert en zelf een functie is die y verwacht: g(x)(y) = f(x, y). Voor drie argumenten geldt hetzelfde patroon: f(x, y, z) wordt f(x)(y)(z).

Voorbeeld in wiskunde en lambda-calculus

Formeel in de lambda-calculus wordt currying weergegeven als een geneste lambda-abstraction:

λx.λy. M

Hier is een functie die eerst x neemt en daarna y. Als je beide argumenten wilt toepassen doe je (λx.λy.M) a b → M[x:=a, y:=b].

Voorbeelden in programmeertalen

Veel functionele talen ondersteunen currying direct of hebben idiomen om het te gebruiken:

  • Haskell
    add :: Int -> Int -> Int add x y = x + y -- add 2 3 == 5 -- add 2  ==> functie die 1 argument verwacht en 2 toevoegt
  • OCaml / SML
    let add x y = x + y (* add 2 3 = 5; add 2 geeft een functie *)
  • JavaScript (niet-curried per definitie, maar met closures te maken)
    function add(x) {   return function(y) {     return x + y;   }; } const add2 = add(2); add2(3); // 5

Currying vs. partial application

Hoewel de termen vaak door elkaar worden gebruikt, is er een verschil:

  • Currying transformeert een functie f(a, b, c) in f(a)(b)(c) — verandering van vorm/representatie.
  • Partial application betekent het vooraf invullen van één of meer argumenten van een functie, zodat er een nieuwe functie met minder argumenten overblijft. Bij een gecurriede functie is partial application een natuurlijke gevolg (bijv. f(2) geeft een functie die de rest verwacht).

Voordelen en nadelen

  • Voordelen
    • Maak functies gemiddeld herbruikbaar en combineerbaar (compositie).
    • Schone API's voor hogere-orde functies (bijvoorbeeld mapping, filtering met aangepaste criteria).
    • Makkelijker gebruik van partial application en point-free stijl.
  • Nadelen / aandachtspunten
    • In sommige talen kan het extra closures creëren en daardoor geheugen of CPU overhead geven.
    • Leesbaarheid kan verminderd worden voor ontwikkelaars die niet vertrouwd zijn met functionele stijl.
    • Sommige bibliotheken/onderdelen verwachten niet-gecurriede functies (dus soms extra onvermijdelijke wrapping).

Historische context

Moses Schönfinkel introduceerde in de jaren 1920 ideeën die direct leidden tot wat we currying noemen; later werd het werk vormgegeven en populair gemaakt door Haskell Curry, naar wie de naam verwijst. Gottlob Frege leverde eerder belangrijke bijdragen aan de formele theorie van functies en logica, die ook de basis leggen voor latere ontwikkelingen.

Praktische tips

  • Gebruik currying wanneer je vaak dezelfde eerste argumenten hergebruikt (bijv. configureerbare helpers).
  • Meet prestatie-impact als je in een imperatieve of prestatiekritische omgeving werkt; soms is een niet-gecurriede versie sneller.
  • Documenteer functies duidelijk: geef aan welke parameters al gebonden worden bij partial application.

Samenvatting

Currying is een fundamentele techniek uit de lambda-calculus en functionele programmeerstijlen waarbij een n-arity functie wordt vertaald naar een reeks eendelige functies. Het maakt partial application en elegante hogere-orde patronen mogelijk, maar vereist aandacht voor prestaties en leesbaarheid in praktische toepassingen.