неизменный в F #
================

Я знаю, что переменные в F # являются неизменяемыми по умолчанию.
Но, например, в F # интерактив:

Итак, я назначаю 4 для x, затем 5 для x, и это меняется. Это правильно? Должно ли это дать какую-то ошибку или предупреждение? Или я просто не понимаю, как это работает?

`let x = 3`, вы привязываете идентификатор`x` к стоимости`3`, Если вы делаете это второй раз в той же области, вы объявляете новый идентификатор, который скрывает предыдущий, так как он имеет то же имя.

Отключение значения в F # осуществляется через оператор деструктивного обновления,`<-`, Это не удастся для неизменных значений, т.е.

Чтобы объявить изменчивую переменную, добавьте`mutable` после`let`:

Но в чем разница между ними, спросите вы? Пример может быть достаточно:

Несмотря на внешность, это бесконечный цикл.`i` объявлено внутри цикла другое`i` это скрывает внешнее. Внешний является неизменным, поэтому он всегда сохраняет свою ценность`0` и цикл никогда не заканчивается. Правильный способ написать это с изменяемой переменной:



 иллюстрирующий идентификатор «затенение». (то есть скрывается) в F #:

Ваш пример на самом деле немного сложнее, потому что вы работаете в F # Interactive (FSI). FSI динамически испускает код, который выглядит примерно так в вашем примере:



`x`вы определяете новую переменную.

Следующий пример показывает, что есть две разные переменные.
(Это также показывает, что вы можете «получить доступ» к старому x, если он находится в замыкании, используемом другой функцией):

доходность

как видите, оба вызова f используют первую переменную`x`, Определение`let x = 0;;` определяет новую переменную`x`, но не переопределяет`f`.



`x` Например: