Anwenden der Map für partielles Argument

8

Mit der folgenden Funktion f mit zwei Argumenten: Was ist die Standardmethode, um map nur auf x anzuwenden?

%Vor%

Genauer gesagt möchte ich die folgende Operation mit map in einer Zeile ausführen.

%Vor%

Eine Möglichkeit dazu ist:

%Vor%

Was ist ein besserer Weg?

    
Alfad 25.04.2012, 11:41
quelle

4 Antworten

14

Zunächst ist es nicht notwendig, Lambda AND Partial zu verwenden - sie sind Alternativen:

%Vor%

Zweitens können Sie das zweite Argument einfach mit partial binden, solange Sie den Namen des Arguments kennen:

%Vor%

Alternativ verwenden Sie ein Listenverständnis:

%Vor%     
Marcin 25.04.2012 11:46
quelle
5
%Vor%

Oder benutzen Sie gar nicht map() , verwenden Sie stattdessen List Comprehensions.

%Vor%

PS: Verwenden Sie nicht list als Variablennamen, es ist ein wichtiger eingebauter Name (der Listentyp).

    
ddaa 25.04.2012 11:46
quelle
5
  

Mit der folgenden Funktion f mit zwei Argumenten: Was ist die Standardmethode, um map nur auf x anzuwenden?

Eine kleine Diskussion über Curry und teilweise Anwendung

In FP-Begriffen ist Ihre Funktion f "uncurried" - während sie konzeptionell zwei Argumente benötigt, sie ' in einer einzigen Produktstruktur gebündelt. In Python ist alles unbeirrt, die ganze Zeit. Sie müssen alle Argumente auf einmal oder keine von ihnen geben.

Um dies zu umgehen, gibt es verschiedene Tricks, aber konzeptionell möchten Sie nur die Funktion "curry". Das heißt, transformiere f(x,y) in f(x) , was eine neue Funktion g(y) zurückgibt.

In standardmäßig voreingestellten Sprachen können Sie diese Übersetzung leicht als:

schreiben %Vor%

So nimmt curry Ihre curried f und ihre Produktargumente separat und wendet die Argumente an, sobald sie alle verfügbar sind. Das Gegenteil ist auch ziemlich einfach:

%Vor%

Wie verhält sich das zur partiellen Anwendung?

  • Curry nimmt eine Funktion an, die eine Struktur des 1 ( n -Produkt) -Arguments annimmt, und gibt eine neue Funktion zurück, die n Argumente verwendet.
  • Partielle Anwendung nimmt eine Funktion von n Argumenten und wendet sie auf k Argumente an, was eine Funktion von nk verbleibenden Argumenten ergibt.

In einer ungezwungenen Sprache kann jedes der Argumente der Reihe nach angewendet werden (z. B. teilweise in Bezug auf die Arität der Funktion). In einer Curry-Sprache müssen Sie zuerst einige Tricks anwenden, um die Funktion zu lösen, wie in den obigen Beispielen.

Ich denke, es ist flexibler, in einer Curry-durch-Standard-Umgebung zu sein, da eine teilweise Anwendung kostenlos ist. In einer solchen Umgebung ist es üblich, Funktionen zu verketten, die Daten modifizieren in eine Pipeline einbauen . Z.B. eine Pipeline von ganzzahligen Modifikationen:

%Vor%

ist nur eine Kette von teilweise angewendeten, nicht gecurried Funktionen, zusammengesetzt, von denen jede auf dem Ausgang der vorherigen Funktion arbeitet. Dies kann nett sein, da es Probleme visuell trennt.

    
Don Stewart 25.04.2012 14:52
quelle
1

Was ist los mit:

%Vor%     
georg 25.04.2012 14:30
quelle