Currying (fra engelsk currying , nogle gange - currying ) - transformationen af en funktion fra mange argumenter til et sæt funktioner, som hver er en funktion af et argument. Muligheden for en sådan transformation blev først bemærket i Gottlob Freges skrifter , systematisk studeret af Moses Scheinfinkel i 1920'erne og opkaldt efter Haskell Curry , udvikleren af kombinatorisk logik , hvor reduktion til funktioner af et argument er grundlæggende.
For en funktion af to argumenter udfører curry-operatoren en konvertering - den tager et type-argument og returnerer en funktion af type . Intuitivt giver curry en funktion dig mulighed for at rette nogle af dens argumenter, mens du returnerer funktionen fra de resterende argumenter. Således er en funktion af typen .
Decurrying ( eng. uncurring ) introduceres som en invers transformation - gendannelse af curried-argumentet: for en funktiondecurry-operatorentransformationen; typen af decurry-operatør er.
I praksis giver currying dig mulighed for at overveje en funktion, der ikke modtog alle de angivne argumenter. Curry-operatøren er indbygget i nogle programmeringssprog for at tillade, at funktioner på flere steder kan curry, de mest almindelige eksempler på sådanne sprog er ML og Haskell . Alle sprog, der understøtter lukninger , giver dig mulighed for at skrive curry-funktioner.
I teoretisk datalogi giver currying en måde at undersøge funktioner af flere argumenter inden for meget simple teoretiske systemer såsom lambda-regningen . I mængdelære er currying en overensstemmelse mellem sæt og . I kategoriteori kommer currying fra den eksponentielle universelle egenskab ; i situationen med en kartesisk lukket kategori fører dette til følgende korrespondance. Der er en bijektion mellem sæt af morfismer fra et binært produkt og morfismer til en eksponentiel , der er naturlig med hensyn til og med hensyn til . Dette udsagn svarer til det faktum, at produkt- og Hom-funktionerne er sammenhængende funktioner.
Dette er en nøgleegenskab for en kartesisk lukket kategori eller mere generelt en lukket monoidal kategori . Den første er ganske tilstrækkelig til klassisk logik, men den anden er et praktisk teoretisk grundlag for kvanteberegning . Forskellen er, at det kartesiske produkt kun indeholder information om et par af to objekter, mens det tensorprodukt, der anvendes i definitionen af en monoidal kategori , er velegnet til at beskrive sammenfiltrede tilstande [1] .
Set fra Curry-Howard-korrespondancens synspunkt er eksistensen af currying-funktioner (type beboelighed og decurrying (type beboelighed ) ækvivalent med et logisk udsagn ( produkttype svarer til konjunktion og funktionel type til implikation ). Currying og decurrying-funktioner er kontinuerlige ifølge Scott .
Currying er meget udbredt i programmeringssprog , primært dem, der understøtter det funktionelle programmeringsparadigme . På nogle sprog er funktioner curried som standard, det vil sige, multi-place-funktioner er implementeret som single-place- funktioner af højere orden , og anvendelsen af argumenter på dem er en sekvens af delvise applikationer .
Programmeringssprog med førsteklasses funktioner definerer normalt operationer curry(oversættelse af en visningssignaturfunktion A, B -> Ctil en signaturfunktion A -> B -> C) og uncurry(udførelse af den omvendte transformation - tilknytning af en visningssignaturfunktion til en A -> B -> Cto-steds funktion af formularen A, B -> C). I disse tilfælde er forbindelsen med den delvise applikationsoperation gennemsigtig papply: curry papply = curry.