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, uncurryund papplyexplizit 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 partialin 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.bindTotrifft 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 assumingMethode eine neue Funktion mit weniger Parametern.

Das Python- Standardbibliotheksmodul functoolsenthält die partialFunktion, 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 ) → ( bc ) = λ ( f , x ). y . f ( x , y )
curry
(( a × b ) → c ) → ( a → ( bc )) = λf . x . y . f ( x , y )
uncurry
( a → ( bc )) → (( a × b ) → c ) = λf . λ ( x , y ). fxy

Beachten Sie, dass curry papply= curry.

Siehe auch

Verweise

Weiterlesen

Externe Links