次のように、一般的なパラメーターを示すチェックマークを理解しています。
Seq.append : seq<'T> -> seq<'T> -> seq<'T>
しかし、次のように、カレットは何を意味しますか。
Seq.average : seq<^T> -> ^T
次のように、一般的なパラメーターを示すチェックマークを理解しています。
Seq.append : seq<'T> -> seq<'T> -> seq<'T>
しかし、次のように、カレットは何を意味しますか。
Seq.average : seq<^T> -> ^T
カレットは、タイプパラメータを静的に解決する必要があることを示しています。これは通常、満たす必要があり、通常の.NETメタデータでは表現できないタイプに特定の制約があるためです。たとえば、は必要な算術演算をサポートしていない ため、がでSeq.average "test"
あっても呼び出すことはできません。"test"
seq<char>
char
これらの静的に解決された型変数は定義からのみ発生しinline
、そのような関数が使用されると、コンパイラーが正しい型固有の命令を挿入できるように、その本体がインライン化されます。
詳細な署名は次のとおりです。
Seq.average : seq<^T> -> ^T (静的メンバー (+) を持つ ^T と静的メンバー DivideByInt を持つ ^T と静的メンバー Zero を持つ ^T が必要です)
とは異なりSeq.append
、Seq.averageには要素の型に関する制約がさらに必要です。特に:
_ DivideByInt (s1 + s2 + ... + sn) n where n <> 0
Seq.average {s1; s2;...; sn} = /
\_ ^T.Zero where n = 0
ご覧のとおり(+)
、DivideByInt
との両方Zero
が必要ですSeq.average<^T>
。
ジェネリックに関する有用な情報は、ここMSDNにあります。
他の人が指摘しているように、慣例により使用され、^T
使用されinline
ませ'T
んが、2つは交換可能 です(時々?)。
したがって、技術的には、あなたの質問に対する答えは「違いはありません」です。
kvbは指摘しました:違いがあります。しかし、他の回答が示すほど明確ではありません。場合によっては、2つは交換可能です。
let inline add (x:^T) (y:^T) = x + y
let inline add (x:'T) (y:'T) = x + y
また
let f (x:^T) = !x
let f (x:'T) = !x
規則は明確ですが、実装は明確ではありません。