Teilanwendung - Partial application
In der Informatik , teilweise Anwendung (oder Teilfunktionsanwendung ) bezieht sich auf den Prozess mehr Argumente auf eine Funktion des Fixierens der Herstellung eines weitere Funktion von kleineren arity . Bei einer gegebenen Funktion könnten wir das erste Argument fixieren (oder 'binden') und eine Funktion vom Typ erzeugen . Die Auswertung dieser Funktion kann als dargestellt werden . Beachten Sie, dass das Ergebnis der partiellen Funktionsanwendung in diesem Fall eine Funktion ist, die zwei Argumente akzeptiert. Die teilweise Anwendung wird manchmal fälschlicherweise als Currying bezeichnet , was ein verwandtes, aber eigenständiges Konzept ist.
Motivation
Intuitiv sagt die Teilfunktionsanwendung "Wenn Sie die ersten Argumente der Funktion korrigieren, erhalten Sie eine Funktion der verbleibenden Argumente". Wenn zum Beispiel die Funktion div ( x , y ) = x / y , dann ist div mit dem auf 1 festgelegten Parameter x eine andere Funktion: div 1 ( y ) = div (1, y ) = 1/ y . Dies entspricht der Funktion inv , die die multiplikative Inverse ihres Arguments zurückgibt, definiert durch inv ( y ) = 1/ y .
Die praktische Motivation für eine partielle Anwendung besteht darin, dass die Funktionen, die durch die Bereitstellung einiger, aber nicht aller Argumente an eine Funktion erhalten werden, sehr oft nützlich sind; zum Beispiel haben viele Sprachen eine Funktion oder einen Operator ähnlich wie plus_one
. Die partielle Anwendung macht es einfach, diese Funktionen zu definieren, indem Sie beispielsweise eine Funktion erstellen, die den Additionsoperator mit 1 als erstem Argument darstellt.
Implementierungen
In Sprachen wie ML , Haskell und F# werden Funktionen standardmäßig in Curryform definiert . Die Angabe von weniger als der Gesamtzahl der Argumente wird als Teilanwendung bezeichnet.
In Sprachen mit First-Class - Funktionen , kann man definieren curry
, uncurry
und papply
explizit currying und teilweise Anwendung auszuführen. Dies kann aufgrund der Erstellung zusätzlicher Closures zu einem größeren Laufzeit-Overhead führen , während Haskell effizientere Techniken verwenden kann.
Scala implementiert optionale Teilanwendungen mit Platzhaltern, zB gibt eine Inkrementierungsfunktion zurück. Scala unterstützt auch mehrere Parameterlisten als Currying, zB .
def add(x: Int, y: Int) = {x+y}; add(1, _: Int)
def add(x: Int)(y: Int) = {x+y}; add(1) _
Clojure implementiert eine Teilanwendung unter Verwendung der partial
in seiner Kernbibliothek definierten Funktion.
Die C++- Standardbibliothek bietet bind(function, args..)
die Möglichkeit , ein Funktionsobjekt zurückzugeben , das das Ergebnis einer teilweisen Anwendung der angegebenen Argumente auf die angegebene Funktion ist. Alternativ können Lambda-Ausdrücke verwendet werden:
int f(int a, int b);
auto f_partial = [](int a) { return f(a, 123); };
assert(f_partial(456) == f(456, 123) );
In Java , MethodHandle.bindTo
trifft teilweise eine Funktion sein erstes Argument. Alternativ können seit Java 8 auch Lambdas verwendet werden:
public static <A, B, R> Function<B, R> partialApply(BiFunction<A, B, R> biFunc, A value) {
return b -> biFunc.apply(value, b);
}
In Raku erstellt die assuming
Methode eine neue Funktion mit weniger Parametern.
Das Python- Standardbibliotheksmodul functools
enthält die partial
Funktion, die Positions- und benannte Argumentbindungen ermöglicht und eine neue Funktion zurückgibt.
In XQuery wird ein Argumentplatzhalter ( ?
) für jedes nicht feste Argument in einer Teilfunktionsanwendung verwendet.
Definitionen
Im einfach typisierten Lambda-Kalkül mit Funktions- und Produkttypen ( λ →,× ) kann teilweise Anwendung, Currying und Entcurrying definiert werden als
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
Beachten Sie, dass curry
papply
= curry
.
Siehe auch
- η-Umwandlung
- POP-2
- Beschränkung (Mathematik) , das allgemeinere Phänomen der Beschränkung einer Funktion auf eine Teilmenge ihres Bereichs
Verweise
Weiterlesen
- Simon Marlow und Simon Peyton-Jones (2004, 2006). "Ein schnelles Curry herstellen: Drücken/Eingeben vs. Bewerten/Anwenden für Sprachen höherer Ordnung" . ICFP '04 Tagungsband der neunten internationalen Konferenz von ACM SIGPLAN zum Thema Funktionale Programmierung .
- Benjamin C. Pierceet al. "Teilanwendung" , "Exkurs: Currying" . Software-Grundlagen .
Externe Links
- Teilfunktionsanwendung auf Rosetta-Code.
- Teilantrag bei Haskell Wiki
- Konstante Bewerbungsform bei Haskell Wiki
- Die Gefahr, zu parteiisch zu sein