Fsharp-generics

提供:Dev Guides
移動先:案内検索

F#-ジェネリック

ジェネリックを使用すると、プログラムで実際に使用されるまで、クラスまたはメソッドのプログラミング要素のデータ型の指定を遅らせることができます。 つまり、ジェネリックを使用すると、任意のデータ型で機能するクラスまたはメソッドを作成できます。

データ型の代替パラメータを使用して、クラスまたはメソッドの仕様を記述します。 コンパイラは、クラスのコンストラクターまたはメソッドの関数呼び出しを検出すると、特定のデータ型を処理するコードを生成します。

F#では、関数の値、メソッド、プロパティ、およびクラス、レコード、判別された共用体などの集約型は汎用的です。

ジェネリックコンストラクトには、少なくとも1つの型パラメーターが含まれます。 汎用の関数と型を使用すると、型ごとにコードを繰り返すことなく、さまざまな型で機能するコードを作成できます。

構文

ジェネリック構造を記述するための構文は次のとおりです-

//Explicitly generic function.
let function-name<type-parameters> parameter-list =
   function-body

//Explicitly generic method.
[ static ] member object-identifer.method-name<type-parameters> parameter-list [ return-type ] =
   method-body

//Explicitly generic class, record, interface, structure,
//or discriminated union.
type type-name<type-parameters> type-definition

( *Generic Function* )
let printFunc x y =
   printfn "%A, %A" x y

printFunc<float> 10.0 20.0

あなたがプログラムをコンパイルして実行すると、次の出力が得られます-

10.0, 20.0

また、単一引用符の構文を使用して関数をジェネリックにすることもできます-

( *Generic Function* )
let printFunction (x: 'a) (y: 'a) =
   printfn "%A %A" x y

printFunction 10.0 20.0

あなたがプログラムをコンパイルして実行すると、次の出力が得られます-

10.0 20.0

ジェネリック関数またはメソッドを使用する場合、タイプ引数を指定する必要がない場合があることに注意してください。 ただし、あいまいな場合は、最初の例で行ったように、角括弧で型引数を指定できます。

複数の型がある場合は、複数の型引数をコンマで区切ります。

ジェネリッククラス

ジェネリック関数と同様に、ジェネリッククラスも作成できます。 次の例はこれを示しています-

type genericClass (x: 'a) =
   do printfn "%A" x

let gr = new genericClass<string>("zara")
let gs = genericClass( seq { for i in 1 .. 10 -> (i, i*i) } )

あなたがプログラムをコンパイルして実行すると、次の出力が得られます-

"zara"
seq [(1, 1); (2, 4); (3, 9); (4, 16); ...]