通用指示符'和符号^在F#方法签名之间有什么区别

Jos*_*den 5 generics f# method-signature

我理解用于表示通用参数的刻度,如:

Seq.append : seq<'T> -> seq<'T> -> seq<'T>
Run Code Online (Sandbox Code Playgroud)

但是插入符号表示什么,如:

Seq.average : seq<^T> -> ^T
Run Code Online (Sandbox Code Playgroud)

kvb*_*kvb 6

插入符号表示必须静态解析类型参数,通常是因为必须满足的类型存在特定约束,并且无法在普通.NET元数据中表示.例如,Seq.average "test"即使"test"是a seq<char>,也不能调用,因为chars不支持必要的算术运算.

这些静态解析的类型变量仅来自inline定义,并且当使用这样的函数时,其内部是内联的,以便编译器可以插入正确的特定于类型的指令.


pad*_*pad 5

详细签名是:

Seq.average:seq <^ T> - > ^ T(需要^ T与静态成员(+)和^ T与静态成员DivideByInt和^ T与静态成员零)

与之不同Seq.append,Seq.average需要对元素类型进行更多限制.尤其:

                                _ DivideByInt (s1 + s2 + ... + sn) n where n <> 0
Seq.average {s1; s2;...; sn} = /
                               \_ ^T.Zero where n = 0
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,(+),DivideByIntZero需要,以便Seq.average<^T>有道理.

有关泛型的有用信息可以MSDN中找到.