Bereich/Reihenfolge der Auswertung von verschachtelten `let .. in ..` in OCaml
Habe ich ein wenig Probleme hier, dass ich nicht 100% verstehe:
let x = 1 in let x = x+2 in let x = x+3 in x
Ich weiß, das Ergebnis dieses Ausdrucks ist 6, sondern wollen einfach nur, um sicherzustellen, dass die Reihenfolge der Berechnung dieses Ausdrucks; das Teil wird zuerst berechnet?
- FYI, es gibt keine Verschlüsse beteiligten in diesem code. Dies ist nur über Variablen Bereich.
- Denn dies ist eine Reine Ausdruck, die Reihenfolge der Auswertung hat keinen sichtbaren Effekt. Da OCaml hat zwingende features, jedoch ist die Reihenfolge der Auswertung für
let v = e1 in e2
angegeben ist: der Ausdrucke1
zuerst ausgewertet, danne2
. Wie Chuck sagt, Ihr Beispiel scheint schwieriger, als es ist, weil Sie den gleichen Namen mehrmals. Dies hat keine Auswirkungen auf etwas anderes als Sie, wie einfach es ist, zu verstehen. Sie können immer mit 3 verschiedenen Variablen-Namen. - Gleiche wie
let x = 1 in let y = x+2 in let z = y+3 in z
- (Ja, genau! Wir haben sogar verwendet die gleichen Variablen-Namen.)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fragte Sie über die um der Auswertung im Ausdruck
let x=1 in let x=x+2 in ...
. Die Reihenfolge ist "von-Links-nach-rechts"! Wenn man eine Kette vonlet a=b in let c=d in ...
, die Reihenfolge der Auswertung ist immer von Links nach rechts.Aber in deinem Beispiel gibt es eine verwirrende Teil: man verwendet die gleichen Variablenname
x
, in jedemlet
konstruieren. Das ist verwirrend, weil Sie dann Dinge sehen, wielet x=x+1
, und dieses sieht wie Sie sind "neu definieren"x
oder "ändern Sie den Wert vonx
". Aber keine "änderung" von "x" passiert eigentlich hier in OCAML! Was geschieht hier, wie bereits oben angemerkt, ist, dass ein neue variable eingeführt wird, jedes mal, also dein Beispiel ist vollkommen äquivalent zuBeachten Sie, dass hier die Reihenfolge der Auswertung ist auch von Links nach rechts. (Es ist immer von Links nach rechts in jeder Kette von
let
- Konstrukte.) In deiner ursprünglichen Frage haben Sie all diese neuen Variablen "x" anstattx
,y
, undz
. Das ist verwirrend für die meisten Menschen. Es ist besser, zu vermeiden, diese Art von coding-Stil.Aber wie überprüfen wir, dass wir Sie umbenannt in Variablen korrekt? Warum "let x=1 in let y=x+2" und nicht "let x=1 in let x=y+2"? Diese
x=x+2
business ist ziemlich verwirrend! Gut, es ist ein anderer Weg zum Verständnis der Bewertung vonlet x=aaa in bbb
. Das Konstruktkann immer ersetzt werden durch die folgende Schließung angewendet
aaa
,Sobald Sie umschreiben, dass es auf diese Weise, Sie können ganz einfach zwei Dinge sehen: Erstens, OCAML nicht bewerten "bbb" in den Verschluss, bis "aaa" bewertet wird. (Aus diesem Grund ist die Bewertung von
let x=aaa in bbb
geht von der ersten Bewertungaaa
und dannbbb
, ist, dass die "Links-nach-rechts".) Zweitens, die variable "x" beschränkt sich auf die Körper der Schließung und damit das "x" nicht sichtbar im inneren der Ausdruck "aaa". Aus diesem Grund, wenn "aaa" enthält eine variable namens "x", es muss bereits definiert mit einem Wert vor, und es hat nichts zu tun mit dem "x" in der Schließung. Aus Gründen der Klarheit wäre es besser, rufen Sie diese variable durch einen anderen Namen.In deinem Beispiel:
ist so geschrieben
Dann ist das innere
let
Konstrukte sind auch neu geschrieben:Lasst uns nun benennen Sie die Argumente der Funktionen innerhalb jeder Funktion, die wir immer tun, ohne eine änderung der Bedeutung des Codes:
Dies ist das gleiche wie
Auf diese Weise können Sie überprüfen, ob Sie umbenannt haben die Variablen richtig.
Vorstellen, parens:
Dann substitute (x=1), wo x es ist nicht abgedeckt durch eine andere Erklärung von x und beseitigen äußerste
let
:Bewerten:
Ersatz:
Bewerten:
Ersatz:
(Dies ist ein wenig lang für einen Kommentar hier ist so eine kleine extra-Antwort.)
Als Chuck Punkte aus, gibt es keine Schließung beteiligt, die in diesem Ausdruck. Nur die Komplexität ist durch die scoping-Regeln. OCaml-scoping-Regeln sind die üblichen ones, D. H., die Namen beziehen sich auf die nächste (innerste) definition. In dem Ausdruck:
Die variable
v
nicht sichtbar ist (D. H., kann nicht genannt werden) ine1
. Wenn (durch Zufall) eine variable mit diesem Namen wird ine1
es muss sich auf irgendeine äußere definition von (einer anderen)v
. Aber die neuev
können (natürlich) benannt werdene2
. So Ihr Ausdruck ist äquivalent zu den folgenden:Scheint es mir, das ist deutlicher, aber es hat genau die gleiche Bedeutung.