Delvis anvendelse - Partial application
I datalogi , delvis anvendelse (eller delvis funktion ansøgning ) henviser til processen med at fastsætte en række argumenter til en funktion, der producerer en anden funktion af mindre arity . I betragtning af en funktion kan vi reparere (eller 'binde') det første argument og producere en funktion af typen . Evaluering af denne funktion kan repræsenteres som . Bemærk, at resultatet af delvis funktionsapplikation i dette tilfælde er en funktion, der tager to argumenter. Delvis anvendelse kaldes undertiden forkert for currying , hvilket er et beslægtet, men tydeligt begreb.
Motivering
Intuitivt siger delvis funktionsapplikation "hvis du retter de første argumenter for funktionen, får du en funktion af de resterende argumenter". For eksempel, hvis funktion div ( x , y ) = x / y , er div med parameteren x fastgjort til 1 en anden funktion: div 1 ( y ) = div (1, y ) = 1 / y . Dette er det samme som funktionen inv, der returnerer multiplikative inverse af sit argument, defineret af inv ( y ) = 1/ y .
Den praktiske motivation for delvis anvendelse er, at meget ofte er de funktioner, der opnås ved at levere nogle, men ikke alle, argumenterne til en funktion nyttige; for eksempel har mange sprog en funktion eller operator, der ligner plus_one. Delvis applikation gør det let at definere disse funktioner, f.eks. Ved at oprette en funktion, der repræsenterer additionsoperatoren med 1 bundet som sit første argument.
Implementeringer
På sprog som ML , Haskell og F# defineres funktioner som standard i kureret form. At angive færre end det samlede antal argumenter omtales som delvis anvendelse.
I sprog med førsteklasses funktioner , kan man definere curry, uncurryog papplyat udføre beredningsmetode og delvise anvendelse eksplicit. Dette kan medføre en større driftstid overhead på grund af oprettelsen af yderligere lukninger , mens Haskell kan bruge mere effektive teknikker.
Scala implementerer valgfri delvis applikation med pladsholder, f.eks. Returnerer en stigende funktion. Scala understøtter også flere parameterlister som currying, f.eks .
def add(x: Int, y: Int) = {x+y}; add(1, _: Int)def add(x: Int)(y: Int) = {x+y}; add(1) _
Clojure implementerer delvis applikation ved hjælp af partialfunktionen defineret i sit kernebibliotek.
The C ++ standard biblioteket tilvejebringer bind(function, args..)at returnere en funktion objekt , der er resultatet af delvis anvendelse af de givne argumenter for en given funktion. Alternativt kan lambda -udtryk bruges:
int f(int a, int b);
auto f_partial = [](int a) { return f(a, 123); };
assert(f_partial(456) == f(456, 123) );
I Java , MethodHandle.bindTogælder delvis en funktion til sin første argument. Alternativt, siden Java 8, kan lambdas bruges:
public static <A, B, R> Function<B, R> partialApply(BiFunction<A, B, R> biFunc, A value) {
return b -> biFunc.apply(value, b);
}
I Raku , den assumingmetode opretter en ny funktion med færre parametre.
Den Python standard biblioteket modul functoolsindeholder partialfunktionen, så positionelle og navngivne argument bindinger, vender tilbage en ny funktion.
I XQuery bruges en argumentpladsholder ( ?) til hvert ikke-faste argument i en delfunktionsapplikation.
Definitioner
I den simpelthen-indtastede lambda-beregning med funktion og produkttyper ( λ →, × ) delapplikation kan currying og uncurry defineres som
papply- ((( a × b ) → c ) × a ) → ( b → c ) = λ ( f , x ). λy . f ( x , y )
curry- (( a × b ) → c ) → ( a → ( b → c )) = λf . λx . λy . f ( x , y )
uncurry- ( a → ( b → c )) → (( a × b ) → c ) = λf . λ ( x , y ). fxy
Bemærk at curry papply= curry.
Se også
- η-konvertering
- POP-2
- Restriktion (matematik) , det mere generelle fænomen, at en funktion begrænses til en delmængde af dens domæne
Referencer
Yderligere læsning
- Simon Marlow og Simon Peyton Jones (2004, 2006). "Lav en hurtig curry: Push/Enter vs. Eval/ansøg om sprog i højere ordning" . ICFP '04 Proceedings of the niende ACM SIGPLAN internationale konference om funktionel programmering .
- Benjamin C. Pierce et al. "Delvis anvendelse" , "Digression: Currying" . Software Foundations .
eksterne links
- Delvis funktionsapplikation på Rosetta -kode.
- Delvis anvendelse på Haskell Wiki
- Konstant applikationsform på Haskell Wiki
- Farerne ved at være for partielle