共用方式為


let 繫結

「繫結」會建立識別碼與值或函式的關聯。 您可以使用 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

您可以指定包含名稱的模式 (例如元組),而不是只指定名稱,如下列程式碼所示。

let i, j, k = (1, 2, 3)

「主體運算式」是使用名稱的運算式。 主體運算式會單獨出現在一行,並縮排以完全對齊 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)

如需詳細資訊,請參閱函式

型別註解

您可以指定參數的類型,方法是包含冒號 (:) 後面接著類型名稱,全部放在括弧之中。 您也可以指定傳回值的類型,方法是在最後一個參數後面附加冒號和類型。 function1 的完整型別註解 (其中以整數作為參數類型) 如下所示。

let function1 (a: int) : int = a + 1

當沒有明確的型別參數時,就會使用型別推斷來判斷函式的參數類型。 這可能包括自動將參數類型一般化為泛型。

如需詳細資訊,請參閱自動一般化型別推斷

類別中的 let 繫結

let 繫結可以出現在類別類型中,但不能出現在結構或記錄類型中。 若要在類別類型中使用 let 繫結,則類別必須有主要建構函式。 建構函式參數必須出現在類別定義中的類型名稱之後。 類別類型中的 let 繫結會定義該類別類型的私用欄位和成員,並與類型中的 do 繫結一起形成類型主要建構函式的程式碼。 下列程式碼範例顯示具有私用欄位 field1field2 的類別 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

field1field2 的範圍僅限於宣告這些欄位的類型。 如需詳細資訊,請參閱類別中的 let 繫結類別

let 中的型別參數

模組層級、類型或計算運算式中的 let 繫結可以有明確的型別參數。 運算式中的 let 繫結 (例如在函式定義中) 不能有型別參數。 如需詳細資訊,請參閱泛型

let 繫結上的屬性

屬性可以套用至模組中的最上層 let 繫結,如下列程式碼所示。

[<Obsolete>]
let function1 x y = x + y

let 繫結的範圍和可存取性

使用 let 繫結宣告的實體範圍僅限於繫結出現之後的包含範圍部分 (例如函式、模組、檔案或類別)。 因此,可以說是 let 繫結將名稱引進範圍。 在模組中,只要模組可供存取,模組的用戶端就能存取 let 繫結值或函式,因為模組中的 let 繫結會編譯成模組的公用函式。 相較之下,類別中的 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# List 模組便有此屬性。

如需模組和存取控制的詳細資訊,請參閱模組存取控制

另請參閱