共用方式為


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#)

請參閱

參考

函式 (F#)

類別中的 let 繫結 (F#)