Rekursive anonyme Funktionen in SML

7

Ist es möglich, rekursive anonyme Funktionen in SML zu schreiben? Ich weiß, ich könnte einfach die fun -Syntax verwenden, aber ich bin neugierig.

Ich habe geschrieben, als ein Beispiel von dem, was ich will:

%Vor%     
dbmikus 10.08.2011, 17:18
quelle

4 Antworten

12

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

%Vor%

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 .

%Vor%

Der Festkomma-Code und die Beispielrechnung wurden freundlicherweise von Morten Brøns-Pedersen zur Verfügung gestellt.

Aktualisierte Antwort auf die Antwort von George Kangas:

  

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 ..

enthält %Vor%

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>     

Jesper.Reenberg 11.08.2011, 11:21
quelle
8

Alles was Sie tun müssen, ist rec nach val , wie in

%Vor%

Wikipedia beschreibt das oben im ersten Abschnitt.

    
murgatroid99 10.08.2011 17:24
quelle
1
%Vor%

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%     
Peng Wang 16.10.2015 16:41
quelle
-1

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", ...

bereitgestellt

Der 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.

    
George Kangas 17.08.2011 05:27
quelle