系 結 會將標識碼與值或函式產生關聯。 您可以使用 let 關鍵字將名稱系結至值或函式。
語法
// Binding a value:
let identifier-or-pattern [: type] =expressionbody-expression
// Binding a function value:
let identifier parameter-list [: return-type ] =expressionbody-expression
備註
關鍵詞 let 用於系結運算式,以定義一或多個名稱的值或函式值。 表達式最簡單的形式 let 會將名稱系結至簡單值,如下所示。
let i = 1
如果您使用新行分隔表達式與標識符,則必須縮排表達式的每一行,如下列程式代碼所示。
let someVeryLongIdentifier =
// Note indentation below.
3 * 4 + 5 * 6
您可以指定包含名稱的模式,例如 Tuple,如下列程式代碼所示。
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
一般而言,參數是模式,例如 Tuple 模式:
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)
如需詳細資訊,請參閱 Functions。
類型批注
您可以指定參數的類型,方法是包含冒號(:)後面接著類型名稱,全部以括弧括住。 您也可以在最後一個參數後面附加冒號和類型,以指定傳回值的型別。 的完整型別批注 function1,具有整數做為參數型別,如下所示。
let function1 (a: int) : int = a + 1
沒有明確的類型參數時,會使用類型推斷來判斷函式的參數類型。 這可包含自動將參數的類型一般化為泛型。
讓類別中的系結
系 let 結可以出現在類別類型中,但不能出現在結構或記錄類型中。 若要在類別類型中使用 let 系結,類別必須具有主要建構函式。 建構函式參數必須出現在類別定義中的類型名稱後面。
let類別類型中的系結會定義該類別類型的私用字段和成員,以及do型別中的系結,形成類型的主要建構函式的程序代碼。 下列程式代碼範例顯示具有私用字段field1和的field2類別MyClass。
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
和 field2 的範圍field1僅限於其宣告的型別。 如需詳細資訊,請參閱let類別和類別中的系結。
中的類型參數讓系結
let模組層級、型別或計算表達式中的系結可以有明確的型別參數。 表達式中的 let 系結,例如在函式定義中,不能有型別參數。 如需詳細資訊,請參閱 泛型。
上的屬性讓系結
屬性可以套用至模組中的最上層 let 系結,如下列程式代碼所示。
[<Obsolete>]
let function1 x y = x + y
Let 系結的範圍和輔助功能
使用 let 系結宣告的實體範圍僅限於系結出現之後包含範圍的部分(例如函式、模組、檔案或類別)。 因此,可以說,let 系結會將名稱引入範圍。 在模組中,只要模組可供存取模組的用戶端存取 let-bound 值或函式,因為模組中的 let 系結會編譯成模組的公用函式。 相較之下,讓類別中的系結是類別的私用。
一般而言,當用戶端程式代碼使用模組時,模組中的函式必須以模組的名稱來限定。 例如,如果模組 Module1 具有函 function1式,則使用者會指定 Module1.function1 來參考函式。
模組的使用者可以使用匯入宣告,讓該模組內的函式可供使用,而不需由模組名稱限定。 在剛才提及的範例中,模組的使用者可以使用匯入宣告open 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# 清單模組具有此屬性。