In der Informatik bezeichnet man als partielle Anwendung (oder partielle Funktionsanwendung ) das Verfahren, bei dem eine bestimmte Anzahl von Argumenten einer Funktion festgelegt wird, um eine Funktion mit geringerer Stelligkeit zu erzeugen . Gegeben sei eine Funktion . Wir könnten das erste Argument festlegen (oder „binden“), wodurch eine Funktion vom Typ entsteht . Die Auswertung dieser Funktion ließe sich als darstellen . Beachten Sie, dass das Ergebnis der partiellen Funktionsanwendung in diesem Fall eine Funktion mit zwei Argumenten ist. Partielle Anwendung wird manchmal fälschlicherweise als Currying bezeichnet , was ein verwandtes, aber eigenständiges Konzept ist.

Motivation

Intuitiv bedeutet partielle Funktionsanwendung: „Wenn man die ersten Argumente der Funktion festlegt, erhält man eine Funktion, die von den verbleibenden Argumenten abhängt.“ Zum Beispiel: Wenn die Funktion `div ( x , y ) = x / y` ist , dann ist `div` mit dem Parameter `x` auf 1 festgelegt eine andere Funktion: `div 1 ( y ) = div (1, y ) = 1/ y` . Dies entspricht der Funktion `inv` , die das multiplikative Inverse ihres Arguments zurückgibt, definiert durch `inv ( y ) = 1/ y` .

Die praktische Motivation für die partielle Anwendung liegt darin, dass die Funktionen, die durch Übergabe einiger, aber nicht aller Argumente einer Funktion entstehen, oft nützlich sind; beispielsweise verfügen viele Programmiersprachen über eine Funktion oder einen Operator, der dem Additionsoperator ähnelt plus_one. Die partielle Anwendung vereinfacht die Definition solcher Funktionen, etwa durch die Erstellung einer Funktion, die den Additionsoperator mit der Grenze 1 als erstem Argument repräsentiert.

Implementierungen

In Sprachen wie ML , Haskell und F# werden Funktionen standardmäßig in Curry- Form definiert . Die Angabe von weniger Argumenten als der Gesamtzahl wird als partielle Anwendung bezeichnet.

In Sprachen mit Funktionen erster Klasse kann man definieren curry, uncurrywie man Currying und partielle Anwendung explizit durchführt. Dies kann aufgrund der Erstellung zusätzlicher Closurespapply einen höheren Laufzeitaufwand verursachen , während Haskell effizientere Techniken verwenden kann. [ 1 ]

Scala implementiert optionale partielle Anwendung mit Platzhaltern, z. B. gibt eine inkrementierende Funktion zurück. Scala unterstützt auch mehrere Parameterlisten als Currying, z. B. . defadd(x:Int,y:Int)={x+y};add(1,_:Int)defadd(x:Int)(y:Int)={x+y};add(1)_

Clojure implementiert partielle Anwendung mithilfe der partialin seiner Kernbibliothek definierten Funktion. [ 2 ]

Die C++- Standardbibliothek bietet die Möglichkeit, ein Funktionsobjektbind(function, args..) zurückzugeben , das das Ergebnis der partiellen Anwendung der übergebenen Argumente auf die gegebene Funktion ist. Seit C++20 gibt es außerdem die Funktion , die die ersten Argumente der Funktion an die Argumente bindet. Im Gegensatz dazu ermöglicht die Funktion, jedes der übergebenen Funktionsargumente zu binden, nicht nur die ersten. Alternativ können Lambda-Ausdrücke verwendet werden. bind_front(function, args...)sizeof...(args)bind

int f ( int a , int b ); auto f_partial = []( int a ) { return f ( a , 123 ); }; assert ( f_partial ( 456 ) == f ( 456 , 123 ) );

In Java wendet MethodHandle.bindTo`apply` eine Funktion partiell auf ihr erstes Argument an. [ 3 ] Alternativ können seit Java 8 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 erzeugt die assumingMethode eine neue Funktion mit weniger Parametern. [ 4 ]

Das Modul der Python -Standardbibliothek functoolsenthält die partialFunktion, die positionelle und benannte Argumentbindungen ermöglicht und eine neue Funktion zurückgibt. [ 5 ]

In XQuery? wird für jedes nicht feste Argument in einer partiellen Funktionsaufrufung ein Argumentplatzhalter ( ) verwendet. [ 6 ]

Definitionen

Im einfach getypten Lambda-Kalkül mit Funktions- und Produkttypen ( λ →,× ) partieller Anwendung lassen sich Currying und Uncurrying wie folgt definieren:

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 currypapply= curry.

Mathematische Formulierung und Beispiele

Die partielle Anwendung kann eine nützliche Methode sein, um verschiedene nützliche Begriffe in der Mathematik zu definieren.

Gegeben seien Mengen und , und eine Funktion . Dann kann man die Funktion definieren.

Dabei ist die Menge der Funktionen . Das Bild von unter dieser Abbildung ist . Dies ist die Funktion, die auf abbildet . Oft gibt es Strukturen auf , die bedeuten, dass sich das Bild von auf eine Teilmenge von Funktionen beschränkt , wie in den folgenden Beispielen veranschaulicht wird.

Gruppenaktionen

Eine Gruppenwirkung kann als Funktion verstanden werden . Die partielle Auswertung beschränkt sich auf die Gruppe der Bijektionen von nach sich selbst. Die Gruppenwirkungsaxiome gewährleisten weiterhin, dass ein Gruppenhomomorphismus ist .

Skalarprodukte und kanonische Abbildung auf das Dual

Das Skalarprodukt eines Vektorraums über einem Körper ist eine Abbildung . Die partielle Auswertung liefert eine kanonische Abbildung in den dualen Vektorraum . Ist dies das Skalarprodukt eines Hilbertraums , so garantiert der Darstellungssatz von Riesz, dass es sich um einen Isomorphismus handelt .

Kreuzprodukte und die adjungierte Abbildung für Lie-Algebren

Die partielle Anwendung des Kreuzprodukts auf ist . Das Bild des Vektors ist eine lineare Abbildung, sodass . Die Komponenten von sind .

This is closely related to the adjoint map for Lie algebras. Lie algebras are equipped with a bracket . The partial application gives a map . The axioms for the bracket ensure this map is a homomorphism of Lie algebras.

See also

References

  1. ^Marlow & Peyton Jones 2004
  2. ^"clojure/clojure, partial function". GitHub. Retrieved 2020-07-18.
  3. ^"MethodHandle (Java Platform SE 7)". docs.oracle.com. Retrieved 2018-09-12.
  4. ^"Method assuming". docs.perl6.org. Retrieved 2018-09-12.
  5. ^"10.2. functools — Higher-order functions and operations on callable objects — Python 3.7.0 documentation". docs.python.org. Retrieved 2018-09-12.
  6. ^"XQuery 3.1: An XML Query Language". www.w3.org. Retrieved 2018-09-12.

Further reading