Поделиться через


Привязки 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#).

См. также

Ссылки

Функции (F#)

Привязки let в классах (F#)