При записи let x = 3
, вы связывания идентификатора x
к значению 3
. Если вы делаете это во второй раз в той же области, вы объявляете новый идентификатор, который скрывает предыдущий, поскольку он имеет то же имя.
Мутирование значения в F # осуществляется с помощью оператора деструктивного обновления, <-
. Это будет терпеть неудачу для неизменных значений, т.е .:
> let x = 3;;
val x : int = 3
> x <- 5;;
x <- 5;;
^^^^^^
stdin(2,1): error FS0027: This value is not mutable
Чтобы объявить переменную изменяемую, добавьте mutable
после let
:
let mutable x = 5;;
val mutable x : int = 5
> x <- 6;;
val it : unit =()
> x;;
val it : int = 6
Но какая разница между этими двумя, вы можете спросить? Например, может быть достаточно:
let i = 0;
while i < 10 do
let i = i + 1
()
Несмотря на видимость, это бесконечный цикл. Объявленный внутри цикла i
отличается от i
, который скрывает внешний. Внешний является неизменным, поэтому он всегда сохраняет свое значение 0
, и цикл никогда не заканчивается. Правильный способ написать это с изменяемым переменной:
let mutable i = 0;
while i < 10 do
i <- i + 1
()
Возможный дубликат http://stackoverflow.com/questions/2844047/what-is-the-let-keyword-in-functional-languages -like-f-and-ocaml-for.Ответы там объясняют различие между привязкой переменной и присваиванием переменной. – Heatsink
@Alex: вы можете найти ответы на [этот вопрос] (http://stackoverflow.com/questions/2478079/f-shadowing-and-nested-function). – Daniel
Вопрос аналогичный, но это не дубликат. –