Unterstützt JavaScript Teilfunktionsanwendungen?

8

Beim Lesen des Wikipedia-Artikels über First-Class-Funktionen gibt es eine nette Tabelle zur Unterstützung der Sprache für verschiedene Aspekte der funktionalen Programmierung: Ссылка

JavaScript ist so aufgeführt, als hätte es keine Teilfunktionsanwendung. Es gibt jedoch Techniken zum Erstellen einer Funktion, die eine Funktion zurückgibt, bei der einige der Parameter in einem Abschluss gespeichert sind, z. B .:

%Vor%

Ist dies nicht Teilfunktionsanwendung? Wenn nicht, könnte jemand bitte ein Beispiel für eine Teilfunktionsanwendung in einer anderen Sprache geben und erklären, wie es anders ist?

Danke!

    
Jason Suárez 22.03.2012, 07:06
quelle

4 Antworten

5

Was Sie zeigen, ist ein Beispiel für Funktionen höherer Ordnung, Funktionen, die Funktionen als Argumente und / oder Rückgabefunktionen annehmen.

Teilweise Anwendung ist etwas anderes. Hier ein Haskell-Beispiel :

%Vor%

add ist eine Funktion, die zwei Int und eine Int , bezeichnet als Int -> Int -> Int , zurückgibt. Wenn Sie mit der Syntax nicht vertraut sind, würde dies in Javascript grob wie folgt aussehen:

%Vor%

add 1 ruft diese Funktion mit nur einem Parameter auf, der eine neue Funktion zurückgibt, die ein Int und ein Int ( Int -> Int ) zurückgibt. Die Funktion add wurde nicht explizit als Funktion höherer Ordnung entworfen, sondern wurde nur teilweise angewendet.

    
deceze 22.03.2012, 07:14
quelle
6

Das Konzept, das Sie nachschlagen sollten, um dies zu verstehen, heißt currying (nach Haskell B. Curry). Es gibt einen Isomorphismus zwischen Funktionen von n + 1 Parametern und eine Funktion mit einem Parameter, der eine Funktion mit n Parametern zurückgibt. Wenn Sie dies rekursiv anwenden, können Sie eine Funktion mit einer beliebigen Anzahl von Parametern als Funktion für Funktionen schreiben.

Aus diesem Grund werden Funktionen in funktionalen Sprachen normalerweise als X -> Y -> Z bedeutung eingegeben. Dies ist eine Funktion, die ein X übernimmt und eine Funktion zurückgibt, die ein Y mit einem Z zurückgibt. Diese Signatur bedeutet auch, dass Sie nur X angeben können und die Funktion eine Funktion selbst zurückgibt.

In Javascript wird eine Funktion von zwei Parametern die Signatur X * Y -> Z haben, was bedeutet, dass es eine Funktion ist, die ein Paar X * Y und einen Z zurückgibt. Sie können jedoch kein halbes Paar liefern.

Es gibt zwei Möglichkeiten:

  • Pfeifen Sie Ihre Funktion immer manuell. Ihre add -Funktion könnte wie folgt geschrieben werden:

    %Vor%

Damit haben Sie nun eine Funktion, die die tatsächliche Signatur Int -> Int -> Int hat, die für die Teilfunktionsanwendung benötigt wird. Sie müssen jedoch auch sicherstellen, dass Sie diese Funktion als curryadd(5)(10) aufrufen, was unnatürlich ist.

  • Stellen Sie Funktionen höherer Ordnung bereit, die Ihre Funktionen curry. In Ihrem Fall führt die Anwendung zwei Dinge aus, sie verwendet die Add-Funktion und bindet den Parameter. Dies kann in zwei Teile unterteilt werden:

    %Vor%

Dies wird den Isomorphismus zwischen Funktionen mit Paaren als Argumente und Funktionen, die Funktionen zurückgeben, implementieren. Es gibt auch eine Möglichkeit, uncurry zu schreiben, was dasselbe rückwärts tut.

Da Sie all dies manuell tun müssen und keine direkte Sprachunterstützung vorhanden ist, wird Javascript als Teilfunktionsanwendung bezeichnet (was nicht bedeutet, dass Sie es nicht zur Sprache hinzufügen können).

    
LiKao 22.03.2012 07:32
quelle
1

Wie in den anderen Antworten erwähnt, ist das Currying; es ist eine Form der partiellen Anwendung, wie Sie identifizieren.

Wenn Sie jedoch nur eine Teilanwendung verwenden möchten, können Sie die Funktion underscore.js verwenden, die eine Menge funktionaler Programmierhilfsprogramme enthält: Ссылка

    
Marcin 22.03.2012 16:41
quelle