Currying (din engleză currying , uneori - currying ) - transformarea unei funcții din mai multe argumente într-un set de funcții, fiecare dintre acestea fiind o funcție a unui argument. Posibilitatea unei astfel de transformări a fost observată pentru prima dată în scrierile lui Gottlob Frege , studiat sistematic de Moses Scheinfinkel în anii 1920 și numit după Haskell Curry , dezvoltatorul logicii combinatorii , în care reducerea la funcții ale unui argument este fundamentală.
Pentru o funcție de două argumente , operatorul curry efectuează o conversie - ia un argument de tip și returnează o funcție de tip . Intuitiv, curry o funcție vă permite să remediați unele dintre argumentele acesteia, în timp ce returnați funcția din argumentele rămase. Astfel, este o funcție de tip .
Decurrying ( eng. uncurring ) este introdus ca o transformare inversă - restabilirea argumentului curred: pentru o funcție, operatorul decurringrealizează transformarea; tipul operatorului decurry este.
În practică, currying vă permite să luați în considerare o funcție care nu a primit toate argumentele furnizate. Operatorul curry este încorporat în unele limbaje de programare pentru a permite funcționarea funcțiilor cu mai multe locuri, cele mai comune exemple de astfel de limbaje fiind ML și Haskell . Toate limbile care acceptă închideri vă permit să scrieți funcții curriculate.
În informatică teoretică , currying oferă o modalitate de a examina funcțiile mai multor argumente în cadrul unor sisteme teoretice foarte simple, cum ar fi calculul lambda . În teoria mulțimilor, currying este o corespondență între mulțimi și . În teoria categoriilor, currying provine din proprietatea universală a exponenţialului ; în situația unei categorii carteziane închise , aceasta conduce la următoarea corespondență. Există o bijecție între seturi de morfisme dintr-un produs binar și morfisme într-un exponențial care este natural în raport cu și în raport cu . Această afirmație este echivalentă cu faptul că functorul produs și functorul Hom sunt functori adjuncți.
Aceasta este o proprietate cheie a unei categorii carteziane închise sau, mai general, a unei categorii monoidale închise . Prima este suficientă pentru logica clasică, dar a doua este o bază teoretică convenabilă pentru calculul cuantic . Diferența este că produsul cartezian conține doar informații despre o pereche de două obiecte, în timp ce produsul tensor utilizat în definirea unei categorii monoidale este potrivit pentru descrierea stărilor încurcate [1] .
Din punctul de vedere al corespondenței Curry-Howard , existența funcțiilor currying (tipul de locuibilitate și decurrying (tipul de locuibilitate ) este echivalentă cu o afirmație logică ( tipul de produs corespunde conjuncției , iar tipul funcțional implicației ). sunt continue după Scott .
Currying-ul este utilizat pe scară largă în limbaje de programare , în primul rând cele care suportă paradigma de programare funcțională . În unele limbi, funcțiile sunt aplicate în mod implicit, adică funcțiile cu mai multe locuri sunt implementate ca funcții de un singur loc de ordine superioară , iar aplicarea argumentelor la acestea este o secvență de aplicații parțiale .
Limbajele de programare cu funcții de primă clasă definesc de obicei operațiuni curry(traducerea unei A, B -> Cfuncții de semnătură de vizualizare într-o funcție de semnătură A -> B -> C) și uncurry(efectuarea transformării inverse - maparea unei funcții de semnătură de vizualizare la o funcție cu A -> B -> Cdouă locuri a formularului A, B -> C). În aceste cazuri, legătura cu operația parțială a aplicației este transparentă papply: curry papply = curry.