let 繫結 (F#)
「繫結」(Binding) 會將識別項與值或函式產生關聯。 使用 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
包含名稱的模式可以指定為 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)
如需詳細資訊,請參閱函式 (F#)。
型別附註
您可以在括號中放入冒號 (:) 後面接著型別名稱,來指定參數型別。 您也可以在最後一個參數後面附加冒號和型別,來指定傳回值的型別。 function1 以整數做為參數型別的完整型別附註如下。
let function1 (a: int) : int = a + 1
當沒有明確型別參數時,會使用型別推斷來判斷函式的參數型別。 這包含自動將參數型別一般化為泛型。
如需詳細資訊,請參閱自動產生 (F#)和型別推斷 (F#)。
類別中的 let 繫結
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
field1 和 field2 的範圍限制為其宣告型別。 如需詳細資訊,請參閱 類別中的 let 繫結 (F#)和 類別 (F#)。
let 繫結中的型別參數
在模組層級、型別或在計算運算式中的 let 繫結可以具有明確型別參數。 在運算式 (例如函式定義) 中的 let 繫結不可以有型別參數。 如需詳細資訊,請參閱泛型 (F#)。
let 繫結上的屬性
屬性可以套用至模組中的最上層 let 繫結,如下列程式碼所示。
[<Obsolete>]
let function1 x y = x + y
範圍和協助工具的 Let 繫結
使用 let 繫結宣告實體的範圍只限於包含的部分範圍 (例如函式、 模組、 檔案或類別) 之後就會出現繫結。 因此,它可以是如此 let 繫結引進了一個名稱,能進入範圍內。 在模組中的 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,這表示它們公開 (expose) 的函式必須以該模組的名稱來限定。 例如,F# 清單模組具有這個屬性。
如需有關模組和存取控制的詳細資訊,請參閱模組 (F#)和存取控制 (F#)。