5

次のように、一般的なパラメーターを示すチェックマークを理解しています。

Seq.append : seq<'T> -> seq<'T> -> seq<'T>

しかし、次のように、カレットは何を意味しますか。

Seq.average : seq<^T> -> ^T
4

3 に答える 3

6

カレットは、タイプパラメータを静的に解決する必要があることを示しています。これは通常、満たす必要があり、通常の.NETメタデータでは表現できないタイプに特定の制約があるためです。たとえば、は必要な算術演算をサポートしていない ため、がでSeq.average "test"あっても呼び出すことはできません。"test"seq<char>char

これらの静的に解決された型変数は定義からのみ発生しinline、そのような関数が使用されると、コンパイラーが正しい型固有の命令を挿入できるように、その本体がインライン化されます。

于 2012-06-28T18:14:59.697 に答える
5

詳細な署名は次のとおりです。

Seq.average : seq<^T> -> ^T (静的メンバー (+) を持つ ^T と静的メンバー DivideByInt を持つ ^T と静的メンバー Zero を持つ ^T が必要です)

とは異なりSeq.appendSeq.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にあります。

于 2012-06-28T18:16:35.997 に答える
0

他の人が指摘しているように、慣例により使用され、^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

規則明確ですが、実装は明確ではありません。

于 2012-06-28T18:25:05.757 に答える