バインディングは、識別子を値または関数に関連付けます。
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
field1
とfield2
のスコープは、宣言されている型に制限されます。 詳細については、「クラスとクラスのバインドの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 モジュールにはこの属性があります。
モジュールとアクセス制御の詳細については、「 モジュール と アクセス制御」を参照してください。
こちらも参照ください
.NET