Currying: definitie en toepassingen in wiskunde lambda-calculus en programmering

Ontdek currying: definitie, geschiedenis en toepassingen in wiskunde, lambda‑calculus en programmeertalen (Haskell, ML) met praktische voorbeelden en tips.

Schrijver: Leandro Alegsa

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.

Vragen en antwoorden

V: Wat is curry?


A: Currying is een techniek uit de wiskunde en informatica waarbij een functie met meerdere argumenten wordt veranderd in een aantal functies met elk één argument.

V: Wie legde de basis voor currying?


A: Wiskundigen Moses Schönfinkel en Gottlob Frege legden de basis voor de currytechniek.

V: Wie is Haskell Brooks Curry en wat heeft hij met curry te maken?


A: Haskell Brooks Curry is een wiskundige naar wie de currytechniek is vernoemd.

V: Wat is lambda calculus?


A: Lambda calculus is een formeel systeem in wiskundige logica en informatica dat gebruikt wordt om berekeningen uit te drukken.

V: Wat is de rol van currying in lambda calculus?


A: Currying wordt in Lambda calculus gebruikt om functies met meerdere argumenten te reduceren tot een reeks functies met slechts één argument.

V: Zijn er programmeertalen die functies beperken tot slechts één argument?


A: Ja, sommige programmeertalen zoals ML en Haskell hebben de beperking dat functies maar één argument kunnen hebben.

V: Waarom beperken programmeertalen zoals ML en Haskell het aantal argumenten dat functies kunnen hebben?


A: Deze beperking wordt gemotiveerd door de eenvoud en flexibiliteit van currying. Door functies met slechts één argument te hebben, kunnen ze gemakkelijk worden samengesteld en gecombineerd, wat leidt tot beknoptere en herbruikbare code.


Zoek in de encyclopedie
AlegsaOnline.com - 2020 / 2025 - License CC3