Quando si scrive let x = 3
, si sono vincolanti l'identificatore x
al valore 3
. Se lo fai una seconda volta nello stesso ambito, stai dichiarando un nuovo identificatore che nasconde il precedente poiché ha lo stesso nome.
La modifica di un valore in F # viene effettuata tramite l'operatore di aggiornamento distruttivo, <-
. Questo fallirà per i valori immutabili, cioè .:
> let x = 3;;
val x : int = 3
> x <- 5;;
x <- 5;;
^^^^^^
stdin(2,1): error FS0027: This value is not mutable
dichiarare una variabile mutabile, aggiungere mutable
dopo let
:
let mutable x = 5;;
val mutable x : int = 5
> x <- 6;;
val it : unit =()
> x;;
val it : int = 6
Ma qual è la differenza tra i due, si potrebbe chiedere? Un esempio potrebbe essere sufficiente:
let i = 0;
while i < 10 do
let i = i + 1
()
Nonostante le apparenze, questo è un ciclo infinito. Il i
dichiarato all'interno del ciclo è diverso i
che nasconde quello esterno. Quello esterno è immutabile, quindi mantiene sempre il suo valore 0
e il ciclo non finisce mai. Il modo corretto di scrivere questo è con una variabile mutabile:
let mutable i = 0;
while i < 10 do
i <- i + 1
()
Eventuali duplicati di http://stackoverflow.com/questions/2844047/what-is-the-let-keyword-in-functional-languages -come-f-e-ocaml-per.Le risposte là spiegano la distinzione tra associazione variabile e assegnazione variabile. – Heatsink
@Alex: è possibile trovare le risposte a [questa domanda] (http://stackoverflow.com/questions/2478079/f-shadowing-and-nested-function) utili. – Daniel
La domanda è simile ma non è un duplicato. –