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?
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>
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.
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%Tags und Links f# functional-programming currying named-parameters