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)
詳細については、「関数 (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
スコープおよびユーザーはバインディングを可能にする
で宣言されたコンテナー スコープの部分にエンティティのスコープは、バインディングが表示されたらバインディングを可能にする制限されます (関数、モジュール、ファイルやクラスなど)。 したがって、バインディングを及ぼすスコープに名前を許可するよう指示できます。 モジュールの場合、モジュールのバインディングを指定してコンパイルされたモジュールのパブリック関数に付与するため、モジュールにアクセスできる限りバインド値または関数は、モジュールのクライアントからアクセス可能です。 対照的に、クラスの束縛は、クラスにプライベート許可します。
通常、モジュールの関数はモジュール名でクライアント コードで使用されるときに修飾する必要があります。 たとえば、モジュール 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があるため、公開する関数がモジュールの名前で修飾する必要があることを意味します。 たとえば、 F# のリストのモジュールにこの属性があります。
モジュールとアクセス制御の詳細については、 モジュール (F#) と アクセス制御 (F#)を参照してください。