静的に解決された型パラメーター (F#)
静的に解決される型パラメーターとは、実行時でなく、コンパイル時に実際の型に置き換えられる型パラメーターです。 これらの前にはキャレット (^) 記号が付きます。
ˆtype-parameter
解説
F# 言語には、異なる 2 種類の型パラメーターがあります。 1 つ目の種類は、標準のジェネリック型パラメーターです。 これらは、'T や 'U のようにアポストロフィ (') で示されます。 これらは、他の .NET Framework 言語のジェネリック型パラメーターと同じです。 もう 1 つの種類は、静的に解決される型パラメーターであり、^T や ^U のようにキャレット記号で示されます。
静的に解決される型パラメーターは、主にメンバー制約で使用する場合に役立ちます。これは、型引数を使用するために特定のメンバーが必要であることを指定できる制約です。 この種の制約を、標準のジェネリック型パラメーターを使用して作成する方法はありません。
2 種類の型パラメーターの類似点と相違点の概要を次の表に示します。
機能 |
ジェネリック |
静的に解決される |
---|---|---|
構文 |
'T, 'U |
^T, ^U |
解決時期 |
実行時 |
コンパイル時 |
メンバー制約 |
メンバー制約では使用できません。 |
メンバー制約で使用できます。 |
コード生成 |
標準のジェネリック型パラメーターを持つ型 (またはメソッド) では、単一のジェネリック型またはジェネリック メソッドが生成されます。 |
各型で必要とされる、型およびメソッドの複数のインスタンス化が生成されます。 |
型での使用 |
型で使用できます。 |
型では使用できません。 |
インライン関数での使用 |
いいえ。 標準のジェネリック型パラメーターではインライン関数をパラメーター化できません。 |
はい。 静的に解決される型パラメーターは、インライン以外の関数またはメソッドでは使用できません。 |
多数の F# コア ライブラリ関数 (特に演算子) には、静的に解決される型パラメーターがあります。 これらの関数および演算子はインラインであり、数値の計算に効率的なコードが生成されます。
演算子を使用するインライン メソッドおよび関数、または静的に解決される型パラメーターを持つ他の関数を使用するインライン メソッドおよび関数では、それらのメソッドおよび関数自体でも静的に解決される型パラメーターを使用できます。 多くの場合、型の推論では、それらのインライン関数が静的に解決される型パラメーターを持つと推論されます。 静的に解決される型パラメーターを持つと推論される演算子の定義を次の例に示します。
let inline (+@) x y = x + x * y
// Call that uses int.
printfn "%d" (1 +@ 1)
// Call that uses float.
printfn "%f" (1.0 +@ 0.5)
解決された (+@) の型は、(+) および (*) の使用に基づいており、これらの両方では型の推論によって、静的に解決される型パラメーターによるメンバー制約が推論されます。 F# インタープリターに表示される解決された型は、次のとおりです。
^a -> ^c -> ^d
when (^a or ^b) : (static member (+) : ^a * ^b -> ^d) and
(^a or ^c) : (static member (+) : ^a & ^c -> ^b)
出力は次のとおりです。
2
1.500000