静的に解決された型パラメーター (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

参照

参照

ジェネリック (F#)

型の推論 (F#)

制約 (F#)

インライン関数 (F#)

その他の技術情報

自動汎化 (F#)