Значения
Значения в F# являются величинами, имеющими конкретный тип. Значения могут быть целыми числами или числами с плавающей запятой, символами или текстом, списками, последовательностями, массивами, кортежами, размеченными объединениями, записями, типами классов или значениями функции.
Привязка значения
Термин привязка означает сопоставление имени с определением. Ключевое слово let
привязывает значение, как показано в следующих примерах:
let a = 1
let b = 100u
let str = "text"
// A function value binding.
let f x = x + 1
Тип значения выводится из определения. Для типа-примитива, такого как целое число или число с плавающей запятой, тип определяется типом литерала. Таким образом, в предыдущем примере компилятор определяет тип b
как unsigned int
, а тип a
— как int
. Тип значения функции определяется по возвращаемому значению в теле функции. Дополнительные сведения о типах значений функций см. в статье Функции. Дополнительные сведения о типах литералов см. в статье Литералы.
Компилятор не выдает диагностические данные о неиспользуемых привязках по умолчанию. Чтобы получить эти сообщения, включите предупреждение 1182 в файле проекта или при вызове компилятора (см. --warnon
в разделе Параметры компилятора).
Для чего нужны неизменяемые значения?
Неизменяемые значения — это значения, которые не могут изменяться в течение всего выполнения программы. Если вы привыкли к таким языкам, как C++, Visual Basic или C#, вас может удивить, что в F# предпочтение отдается неизменяемым значениям, а не переменным, которым можно назначать новые значения во время выполнения программы. Неизменяемые данные являются важным элементом функционального программирования. В многопоточной среде управлять общими изменяемыми переменными, которые могут изменяться множеством разных потоков, довольно сложно. Кроме того, при работе с изменяемыми переменными иногда бывает трудно определить, может ли переменная изменяться при передаче в другую функцию.
В чисто функциональных языках переменные отсутствуют, а функции ведут себя строго как математические функции. Там, где код на процедурном языке присваивает переменную для изменения значения, эквивалентный код на функциональном языке использует неизменяемое значение, относящееся к входным данным, неизменяемую функцию и разные неизменяемые значения в качестве выходных данных. Такая математическая строгость позволяет точнее организовать работу программы. Это позволяет компиляторам строже проверять код и эффективнее оптимизировать его, а также помогает разработчикам читать и составлять код правильно. Таким образом, по сравнению с обычным процедурным кодом отладка функционального кода, скорее всего, будет выполнять проще.
Хотя F# и не является чисто функциональным языком, он полностью поддерживает возможности функционального программирования. Применять неизменяемые значения крайне полезно, так как это позволяет коду использовать важные преимущества функционального программирования.
Изменяемые переменные
Вы можете использовать ключевое слово mutable
для задания переменной, которую можно изменить. В общем случае изменяемые переменные в F# должны иметь ограниченную область действия, например в виде поля типа или локального значения. Изменяемыми переменными с ограниченной областью легче управлять, кроме того, для них ниже вероятность ошибочного изменения.
Вы можете присвоить изменяемой переменной начальное значение с помощью ключевого слова let
точно так же, как и при определении значения. Отличие заключается в том, что позднее изменяемым переменным можно присваивать новые значения с помощью оператора <-
, как показано в следующем примере.
let mutable x = 1
x <- x + 1
Значения, помеченные как mutable
, могут автоматически передаваться в 'a ref
, если они захватывается замыканием, включая формы, создающие замыкания, такие как построители seq
. Если вы хотите получать уведомления об этом, включите предупреждение 3180 в файле проекта или при вызове компилятора.
См. также
Заголовок | Описание |
---|---|
Привязки let | Содержит сведения об использовании ключевого слова let для привязки имен к значениям и функциям. |
Функции | Содержит общие сведения о функциях в F#. |