Die anonyme Funktion ist nicht mehr wirklich anonym, wenn Sie sie an einen binden
Variable. Und da val rec
nur die abgeleitete Form von fun
mit nein ist
Unterschied anders als Aussehen, Sie könnten es genauso gut mit geschrieben haben
die fun
-Syntax. Sie können auch Mustervergleiche in fn
-Ausdrücken vornehmen
wie in case
, da Fälle von fn
abgeleitet sind.
Sie hätten also in ihrer ganzen Einfachheit Ihre Funktion als
schreiben können %Vor%aber das ist das selbe wie das unten lesbarere (in meiner Meinung)
%Vor% Soweit ich denke, gibt es nur einen Grund dafür, Ihren Code mit dem zu schreiben
lang val rec
, und das liegt daran, dass Sie Ihren Code einfacher mit Anmerkungen versehen können
Kommentare und erzwungene Typen. Zum Beispiel, wenn Sie Haskell Code vor und gesehen haben
Wie die Art, wie sie ihre Funktionen kommentieren, könnte man etwas schreiben
wie das
Wie bereits erwähnt, ist es möglich, einen Fixpunkt zu verwenden Kombinator. Ein solcher Kombinator könnte aussehen wie
%Vor% Und Sie könnten dann fact 5
mit dem folgenden Code berechnen, der anonym verwendet
Funktionen, um die Fakultät Funktion auszudrücken und bindet dann das Ergebnis der
Berechnung nach res
.
Der Festkomma-Code und die Beispielrechnung wurden freundlicherweise von Morten Brøns-Pedersen zur Verfügung gestellt.
In Sprachen, die ich kenne, wird eine rekursive Funktion immer an a gebunden Name. Die bequeme und konventionelle Art wird durch Schlüsselwörter wie bereitgestellt "definieren" oder "lassen" oder "letrec", ...
Nach Definition definitionsgemäß wahr. Wenn die Funktion (rekursiv oder nicht) nicht an einen Namen gebunden wäre, wäre sie anonym.
Der unkonventionelle, anonymer wirkende Weg ist durch Lambda-Bindung.
Ich sehe nicht, was anonymen Funktionen unkonventionell ist, sie werden ständig in SML verwendet, in jeder funktionalen Sprache. Es beginnt sogar, sich in immer mehr Imperativsprachen zu zeigen.
Jesper Reenbergs Antwort zeigt Lambda-Bindung; das "anonyme" Funktion wird von Lambdas (genannt.) an die Namen "f" und "fact" gebunden "Fn" in SML).
Die anonyme Funktion ist in der Tat anonym (nicht "anonym" - keine Anführungszeichen), und ja, natürlich wird sie im scope der Funktion, an die sie als Argument übergeben wird, gebunden . In allen anderen Fällen wäre die Sprache völlig nutzlos. Dasselbe passiert auch, wenn map (fn x => x) [.....]
aufgerufen wird, in diesem Fall ist die anonyme Identitätsfunktion tatsächlich anonym.
Die "normale" Definition einer anonymen Funktion (zumindest nach wikipedia ), die besagt, dass es nicht sein darf an einen Bezeichner gebunden, ist ein wenig schwach und sollte die implizite Anweisung "in der aktuellen Umgebung" enthalten.
Dies ist in der Tat wahr für mein Beispiel, wenn man es in mlton mit dem Argument -show-basis in einer Datei zeigt, die nur fun Y ...
und val res ..
Daraus wird ersichtlich, dass keine der anonymen Funktionen in der Umgebung gebunden sind.
Eine kürzere "lambdanonymous" Alternative, für die OCaml eingeführt werden muss von "ocaml -rectypes":
%Vor%
Es scheint, dass Sie die Idee der ursprünglichen Frage völlig missverstanden haben:
Ist es möglich, rekursive anonyme Funktionen in SML zu schreiben?
Und die einfache Antwort ist ja. Die komplexe Antwort ist (unter anderem?) Ein Beispiel dafür, das mit einem Fixpunktkombinator gemacht wurde, nicht mit einem "lambdanonymous" (was auch immer gemeint ist), das in einer anderen Sprache mit Funktionen ausgeführt wird, die in SML nicht einmal entfernt möglich sind. p>
Alles was Sie tun müssen, ist rec
nach val
, wie in
Wikipedia beschreibt das oben im ersten Abschnitt.
Dies ist eine rekursive anonyme Funktion. Der Name 'fact' wird nur intern verwendet.
Einige Sprachen (z. B. Coq) verwenden "fix" als Grundelement für rekursive Funktionen, während einige Sprachen (z. B. SML) rekursive-let als primitive verwenden. Diese beiden Primitive können sich gegenseitig codieren:
%Vor%In Sprachen, die ich kenne, wird eine rekursive Funktion immer an einen Namen gebunden. Der bequeme und konventionelle Weg wird durch Schlüsselwörter wie "define" oder "let" oder "letrec", ...
bereitgestelltDer unkonventionelle, anonymere schauende Weg ist durch Lambda-Bindung. Jesper Reenbergs Antwort zeigt Lambda-Bindung; Die "anonyme" Funktion wird durch Lambdas an die Namen "f" und "fact" gebunden (in SML "fn" genannt).
Eine kürzere "lambdanonymous" Alternative, die OCaml benötigt, das von "ocaml-rectypes" gestartet wurde:
%Vor%Was 7 ergibt! = 5040.
Tags und Links functional-programming recursion anonymous-function sml