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)
插入符号表示必须静态解析类型参数,通常是因为必须满足的类型存在特定约束,并且无法在普通.NET元数据中表示.例如,Seq.average "test"即使"test"是a seq<char>,也不能调用,因为chars不支持必要的算术运算.
这些静态解析的类型变量仅来自inline定义,并且当使用这样的函数时,其内部是内联的,以便编译器可以插入正确的特定于类型的指令.
详细签名是:
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)
正如你所看到的,(+),DivideByInt和Zero需要,以便Seq.average<^T>有道理.
有关泛型的有用信息可以在MSDN中找到.