Ich weiß, dass Variablen in F # standardmäßig unveränderlich sind. Aber zum Beispiel in F # interactive:
%Vor%Also weise ich 4 x zu, dann 5 x und es ändert sich. Ist es richtig? Sollte es einen Fehler oder eine Warnung geben? Oder ich verstehe einfach nicht, wie es funktioniert?
Wenn Sie let x = 3
schreiben, binden Sie den Bezeichner x
an den Wert 3
. Wenn Sie dies ein zweites Mal im selben Bereich tun, deklarieren Sie eine neue ID, die die vorherige versteckt, da sie den gleichen Namen hat.
Das Mutieren eines Wertes in F # erfolgt über den destruktiven Update-Operator <-
. Dies schlägt bei unveränderbaren Werten fehl, d. H .:
Um eine änderbare Variable zu deklarieren, fügen Sie mutable
nach let
:
Aber was ist der Unterschied zwischen den beiden, könnten Sie fragen? Ein Beispiel kann genug sein:
%Vor% Trotz der Erscheinungen ist dies eine Endlosschleife. Die in der Schleife deklarierte i
ist eine andere i
, die die äußere versteckt. Der äußere ist unveränderlich, behält also immer den Wert 0
und die Schleife endet nie. Der richtige Weg dies zu schreiben ist mit einer veränderbaren Variable:
Sie ordnen 5% x
nicht zu, Sie definieren eine neue Variable.
Das folgende Beispiel zeigt, dass es zwei verschiedene Variablen gibt. (Es zeigt auch, dass Sie auf das alte x "zugreifen" können, wenn es sich in einer Schließung befindet, die von einer anderen Funktion verwendet wird):
%Vor%ergibt
%Vor% Wie Sie sehen, verwenden beide Aufrufe von f die erste Variable x
. Die Definition let x = 0;;
definiert eine neue Variable x
, definiert aber f
nicht neu.
Hier ist ein minimales Beispiel, das den Bezeichner "Shadowing" (d. h. Verbergen) in F # veranschaulicht:
%Vor%Ihr Beispiel ist etwas komplizierter, weil Sie in F # Interactive (FSI) arbeiten. FSI gibt dynamisch Code aus, der in Ihrem Beispiel ungefähr wie folgt aussieht:
%Vor%Tags und Links f# shadowing immutability