Возможно, наиболее важным оператором, без которого сложно обойтись, является оператор let. Этот оператор позволяет определить значения (value) и связать их с данными или действиями. То есть по сути значения представляют некоторые данные или действия, которые мы можем использовать в программе.
Общая форма определения значения:
let название_значения = данные/действия
После названия значения через знак равно(=) указываются связываемые с этим значением данные или действия.
В качестве названия значения может выступать произвольное название. Например, определим идентификатор name:
let name
Однако подобное выражение неполное: нам надо что-то связать с этим значением. Что можно связать со значением? Это могут быть какие-то конкретные данные - числа, строки,
хотя это также могут быть и целые действия. В данном случае мы сначала рассмотрим привязку данных. Например, передадим значению name
какую-нибудь строку:
let name = "Tom"
Таким образом, мы определили значение name
, которое связано со строкой "Tom" (по сути хранит строку "Tom").
Теперь определим программу, где используем этот значение:
let name = "Tom" printfn "%s" name
В данном случае сначала определяем значение name
, которое хранит строку "Tom". Затем мы передаем это значение для вывода на консоль
функции printfn(). Для этого после названия функции printfn
сначала идет строка "%s". %s
указывает, что на месте этих символов
(если точнее этого спецификатора) будет вставляться строка (значение name
у нас представляет строку).
Далее после "%s" указывается, что будет вставляться вместо %s
, то есть значение name
.
Запустим данную программу, и на консоль будет выведено значение name
, то есть строка "Tom"
C:\Users\eugen\fsharp>dotnet fsi program.fsx Tom C:\Users\eugen\fsharp>
Таким образом, как мы видим, значения позволяют сохранять данные, которые далее могут использоваться в программе.
Подобным образом можно определять и другие значения, например:
let name = "Tom" printfn "Name: %s" name let age = 39 printfn "Age: %d" age
Здесь также определяется значение age, которое представляет число 39. Поскольку оно представляет целое число, то для его
вывода на консоль нам надо использовать спецификатор %d
. Таким образом, в последней строке кода при выводе на консоль в строку
"Age %d" вместо %d
будет вставляться значение age
. Консольный вывод программы:
C:\Users\eugen\fsharp>dotnet fsi program.fsx Name: Tom Age: 39 C:\Users\eugen\fsharp>
Все значения по умолчанию являются неизменяемыми (immutable). Например, определим следующую программу:
let name = "Tom" printfn "%s" name // Tom name = "Bob" // здесь мы хотим поменять значение на "Bob" printfn "%s" name // Мы хотим, чтобы здесь выводило "Bob", но выводит "Tom"
Консольный вывод программы:
Tom Tom
Здесь мы видим, что несмотря на строку кода name = "Bob"
данные значения name
не изменились.
В этом плане значения в F# похожи на константы в некоторых языках программирования. Immutablity/неизменяемость делает программу более предсказуемой и позволяет гарантировать,
мы будем использовать те значения, которые мы ожидаем. Однако иногда необходимо все таки менять значения. В этом случае значение определяется с помощью ключевого слова mutable:
let mutable name = "Tom" printfn "%s" name // Tom name <- "Bob" printfn "%s" name // Bob
При этом чтобы присвоить значению новые данные применяется оператор <-.
Консольный вывод программы:
Tom Bob