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)
型別附註
您可以在括號中放入冒號 (:) 後面接著型別名稱,來指定參數型別。 您也可以在最後一個參數後面附加冒號和型別,來指定傳回值的型別。 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#)。
let 繫結中的型別參數
在模組層級、型別或在計算運算式中的 let 繫結可以具有明確型別參數。 在運算式 (例如函式定義) 中的 let 繫結不可以有型別參數。 如需詳細資訊,請參閱泛型 (F#)。
let 繫結上的屬性
屬性可以套用至模組中的最上層 let 繫結,如下列程式碼所示。
[<Obsolete>]
let function1 x y = x + y