次の方法で共有


let Bindings

バインディングは、識別子を値または関数に関連付けます。 let キーワードを使用して、名前を値または関数にバインドします。

構文

// Binding a value:
let identifier-or-pattern [: type] =expressionbody-expression
// Binding a function value:
let identifier parameter-list [: return-type ] =expressionbody-expression

注釈

let キーワードは、バインド式で 1 つ以上の名前の値または関数値を定義するために使用されます。 let式の最も単純な形式では、次のように名前を単純な値にバインドします。

let i = 1

新しい行を使用して式を識別子から分離する場合は、次のコードのように、式の各行をインデントする必要があります。

let someVeryLongIdentifier =
    // Note indentation below.
    3 * 4 + 5 * 6

名前だけでなく、次のコードに示すように、名前を含むパターン (タプルなど) を指定できます。

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

一般に、パラメーターはタプル パターンなどのパターンです。

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 Bindings in Classes

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

field1field2のスコープは、宣言されている型に制限されます。 詳細については、「クラスとクラスのバインドのlet」を参照してください。

let バインディングの型パラメーター

モジュール レベル、型、またはコンピュテーション式の let バインドには、明示的な型パラメーターを指定できます。 関数定義内などの式の let バインディングには、型パラメーターを指定できません。 詳細については、「 ジェネリック」を参照してください。

let バインディングの属性

属性は、次のコードに示すように、モジュール内の最上位レベルの let バインドに適用できます。

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

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 モジュールにはこの属性があります。

モジュールとアクセス制御の詳細については、「 モジュールアクセス制御」を参照してください。

こちらも参照ください