Привязки 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)
Дополнительные сведения см. в разделе Функции (F#).
Аннотации типа
Можно задать типы параметров, добавив двоеточие (:) и следующее за ним имя типа; все вместе должно быть заключено в круглые скобки.Можно также задать тип возвращаемого значения, добавив двоеточие и тип после последнего параметра.Полные аннотации типа 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#) и Классы (F#).
Параметры типа в привязках let
Привязка let на уровне модуля в типе или в вычислительном выражении может иметь явные параметры типов.Привязка let в выражении, например в определении функции, не может иметь параметров типа.Дополнительные сведения см. в разделе Универсальные шаблоны (F#).
Атрибуты привязок let
Атрибуты могут применяться к привязкам let высшего уровня в модуле, как показано в следующем коде.
[<Obsolete>]
let function1 x y = x + y
Область и специальные возможности позволяют let
Область сущности, объявленной с препятствовала привязке ограничена части области (например, функция, модуль файл или класс) после привязки.Поэтому ней можно сказать, что режим привязке вставляет имя в область.В модуле, препятствовать-привязанные значение или функции доступны клиентам модуля, пока модуль недоступен, поскольку привязки let в модуле компилировать в общие функции модуля.Напротив, привязки let в классах закрытым к классу.
Обычно функции в модулях должны быть квалифицированы с именем модуля при использовании клиентским кодом.Например, если модуль Module1 имеет функцию function1, то пользователи указанных бы Module1.function1 для ссылки на функции.
Пользователи могут использовать объявление модуля импорт, чтобы сделать функции в пределах доступных модулей для использования без быть полным именем модуля.В упомянутом примере пользователи могут открыть модуля в этом случае модуль с помощью открытого Module1 объявления импорта и затем ссылаться на function1 напрямую.
module Module1 =
let function1 x = x + 1.0
module Module2 =
let function2 x =
Module1.function1 x
open Module1
let function3 x =
function1 x
Некоторые модули имеют атрибут RequireQualifiedAccess, что означает, что они предоставляют функции, которые должны быть квалифицированы с именем модуля.Например, модуль списка F# содержит этот атрибут.
Дополнительные сведения о модулях и управлении доступом см. в разделе Модули (F#) и Управление доступом (F#).