let バインディング (F#)
バインディングは、識別子を値または関数に関連付けます。 名前を値または関数にバインドするには、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 キーワードは、1 つ以上の名前に対して値または関数の値を定義するバインディング式で使用します。 最も簡単な形式の let 式は、次のように、1 つの名前を 1 つの単純な値にバインドする式です。
let i = 1
式と識別子を別々の行に分ける場合は、次のコードのように、式の各行にインデントを設定する必要があります。
let someVeryLongIdentifier =
// Note indentation below.
3 * 4 + 5 * 6
1 つの名前だけでなく、複数の名前を含むパターンを指定できます。たとえば、次のコードに示すように、組を指定できます。
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
明示的な型パラメーターがない場合は、型の推論を使用して、関数のパラメーターの型が決定されます。 この場合に、パラメーターの型をジェネリックにする汎化が自動的に行われることがあります。
詳細については、「自動汎化 (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