Привязки let (F#)
Привязка связывает идентификатор со значением или функцией. Ключевое слово let используется для привязки имени к значению или функции.
// Binding a value:
let identifier-or-pattern [: type] =
expression
body-expression
// Binding a function value:
let identifier parameter-list [: return-type ] =
expression
body-expression
Заметки
Ключевое слово let используется в привязке выражений для определения значений или функциональных значений одного или более имен. Наиболее простая форма выражения let привязывает имя к простому значению, как показано ниже.
let i = 1
Если разделить выражение и идентификатор новой строкой, то необходимо использовать отступ для каждой строки выражения, как показано в следующем коде.
let someVeryLongIdentifier =
// Note indentation below.
3 * 4 + 5 * 6
Вместо простого имени можно задать шаблон с именами, например кортеж, как показано в следующем коде.
let i, j, k = (1, 2, 3)
body-expression — выражение, в котором используются имена. Выражение тела находится на отдельной строке с отступом до первого символа ключевого слова let строкой выше.
let result =
let i, j, k = (1, 2, 3)
// Body expression:
i + 2*j + 3*k
Привязка let может располагаться на уровне модуля, в определении типа класса или в локальных областях, например в определении функции. Привязка let на высшем уровне в модуле или в типе класса не нуждается в выражении тела, но на других уровнях областей выражение тела обязательно. Привязанные имена можно использовать после точки определения, но не ранее, чем появляется привязка let, как проиллюстрировано в следующем коде.
// Error:
printfn "%d" x
let x = 100
// OK:
printfn "%d" x
Привязки функций
Привязки функций подчиняются правилам привязки значений, за исключением того, что привязки функций включают в себя имя функции и параметры, как показано в следующем коде.
let function1 a =
a + 1
В общем, параметры являются шаблонами, таким как шаблон кортежа.
let function2 (a, b) = a + b
Выражение привязки let имеет значение последнего выражения. Поэтому в следующем примере кода значение result вычисляется как 100 * function3 (1, 2), что дает в результате 300.
let result =
let function3 (a, b) = a + b
100 * function3 (1, 2)
Аннотации типа
Можно задать типы параметров, добавив двоеточие (:) и следующее за ним имя типа; все вместе должно быть заключено в круглые скобки. Можно также задать тип возвращаемого значения, добавив двоеточие и тип после последнего параметра. Полные аннотации типа function1, где для параметров задан целочисленный тип, будут выглядеть следующим образом.
let function1 (a: int) : int = a + 1
Когда нет явных параметров типа, используется вывод типа для определения типов параметров функций. В том числе возможно автоматическое обобщение типа параметра до универсального.
Дополнительные сведения см. в разделах Автоматическое обобщение (F#) и Вывод типа (F#).
Привязки let в классах
Привязка let может находиться в типе класса, но не в типе структуры или записи. Чтобы можно было использовать привязку let в типе класса, класс должен иметь первичный конструктор. Параметры конструктора должны быть расположены после имени типа в определении класса. Привязка let в типе класса определяет закрытые поля и члены для этого типа класса и, совместно с привязками do в типе, формирует код первичного конструктора для типа. Следующий пример кода показывает класс MyClass с закрытыми полями field1 и field2.
type MyClass(a) =
let field1 = a
let field2 = "text"
do printfn "%d %s" field1 field2
member this.F input =
printfn "Field1 %d Field2 %s Input %A" field1 field2 input
Области полей field1 и field2 ограничены типом, в котором они определены. Дополнительные сведения см. в разделе Привязки let в классах (F#).
Параметры типа в привязках let
Привязка let на уровне модуля в типе или в вычислительном выражении может иметь явные параметры типов. Привязка let в выражении, например в определении функции, не может иметь параметров типа. Дополнительные сведения см. в разделе Универсальные шаблоны (F#).
Атрибуты привязок let
Атрибуты могут применяться к привязкам let высшего уровня в модуле, как показано в следующем коде.
[<Obsolete>]
let function1 x y = x + y