Wie curry den 2. (oder 3., 4., ...) Parameter in F # oder einer funktionalen Sprache?

8

Ich fange gerade mit F # an und sehe, wie man currying benutzt, um den 1. Parameter zu einer Funktion vorzuladen. Aber wie würde man es mit dem zweiten, dritten oder anderen Parameter machen? Würden benannte Parameter dies erleichtern? Gibt es noch andere funktionale Sprachen, die Parameter benannt haben oder eine andere Möglichkeit bieten, um das Currieren gleichgültig gegenüber der Parameterreihenfolge zu machen?

    
Dax Fohl 15.12.2009, 23:04
quelle

4 Antworten

15

Normalerweise verwenden Sie nur ein Lambda:

%Vor%

ist eine Funktion wie 'f', aber der dritte Parameter ist an 42 gebunden.

Sie können auch Kombinatoren verwenden (wie jemand Haskells "Flip" in einem Kommentar erwähnt hat), die Argumente umordnen, aber das finde ich manchmal verwirrend.

Beachten Sie, dass die meisten curied-Funktionen so geschrieben sind, dass das Argument "am wahrscheinlichsten zu teilweises Anwenden" an erster Stelle steht.

F # hat Parameter für Methoden benannt (keine Werte für gebundene Funktionen), aber die Namen gelten für "Tupel" -Parameter. Genannte Curry-Parameter sind wenig sinnvoll; Wenn ich eine zwei Argumente aufweisende Curry-Funktion 'f' habe, würde ich das mit

erwarten %Vor%

dann wäre 'g' oder 'h' für 'f' substituierbar, aber 'benannte' Parameter machen dies nicht unbedingt wahr. Das heißt, "benannte Parameter" können schlecht mit anderen Aspekten des Sprachdesigns interagieren, und ich persönlich kenne kein gutes Design für "benannte Parameter", das gut mit "erstklassigen Curryfunktionswerten" interagiert / p>     

Brian 15.12.2009, 23:12
quelle
3

OCaml, die Sprache, auf der F # basierte, hat (und optional) Argumente benannt, die in beliebiger Reihenfolge angegeben werden können, und Sie können eine Funktion teilweise basierend auf den Namen dieser Argumente anwenden. Ich glaube nicht, dass F # diese Funktion hat.

Sie könnten versuchen, etwas wie Haskells flip -Funktion zu erstellen. Das Erstellen von Varianten, die das Argument weiter in der Argumentliste überspringen, sollte nicht zu schwer sein.

%Vor%     
Chuck 15.12.2009 23:22
quelle
3

Nur der Vollständigkeit halber - und nachdem Sie nach anderen funktionalen Sprachen gefragt haben - so würden Sie es in OCaml machen, wohl die "Mutter" von F #:

%Vor%

So können Sie in OCaml einen beliebigen benannten Parameter fest codieren, indem Sie einfach seinen Namen verwenden ( y im obigen Beispiel).

Microsoft entschied sich dafür, diese Funktion nicht zu implementieren, wie Sie herausgefunden haben ... Meiner bescheidenen Meinung nach geht es nicht um "schlechte Interaktion mit anderen Aspekten des Sprachdesigns" ... es ist wahrscheinlicher wegen des zusätzlichen Aufwands würde erfordern (in der Sprachimplementierung) und die Verzögerung, die es verursachen würde, die Sprache zur Welt zu bringen - wenn tatsächlich nur wenige Menschen (a) sich der "Abstufung" von OCaml bewusst sein würden, (b) benannte Funktionsargumente trotzdem verwenden .

Ich bin in der Minderheit und benutze sie - aber es ist in der Tat etwas, das in F # mit einer lokalen Funktionsbindung leicht emuliert wird:

%Vor%     
ttsiodras 05.11.2014 13:20
quelle
2

In Python können Sie functools.partial oder ein Lambda verwenden. Python hat Argumente benannt. functools.partial kann verwendet werden, um die ersten Positionsargumente sowie jedes benannte Argument anzugeben.

%Vor%     
codeape 15.12.2009 23:26
quelle