12

t<'a>F#和'a tF#之间的含义有什么区别吗?即使在声明之后它们可以互换使用吗?

4

4 回答 4

14

没有区别,是的,即使在声明之后它们也可以互换使用。

但请注意F# 组件设计指南建议(第 4.2 节):

考虑使用泛型的前缀语法 ( Foo<T>) 而不是后缀语法 ( T Foo),但有四个值得注意的例外 ( list, option, array, ref)。

F# 继承了命名泛型类型的后缀 ML 样式,例如“<code>int list”以及前缀 .NET 样式,例如“<code>list<int>”。除了四种特定类型之外,您应该更喜欢 .NET 样式。对于 F# 列表,使用后缀形式:“<code>int list”而不是“<code>list<int>”。对于选项,使用后缀形式:“<code>int option”而不是“<code>option<int>”。对于数组,使用语法名称“<code>int[]”而不是“<code>int array”或“<code>array<int>”。对于refs,请使用“<code>int ref”而不是“<code>ref<int>”或“<code>Ref<int>”。对于所有其他类型,使用前缀形式:“<code>HashSet<int>”、“<code>Dictionary<string,int>”、

此外,如果您使用 ML 风格的通用参数列表表示法,例如('a,'b) tvs. ,您将收到编译器警告t<'a,'b>

在此过程中,请注意同一指南第 3.1 节中的以下建议:

对公共 API 中的通用参数名称使用 PascalCase,包括面向 F# 的库。特别是,对任意通用参数使用 T、U、T1、T2 等名称,当特定名称有意义时,对于面向 F# 的库,使用 Key、Value、Arg 等名称(但不包括 TKey)。

(尽管我个人倾向于忽略面向 F# 的公共库的这一建议)。

于 2012-04-16T01:33:57.663 回答
3

完全没有区别,不确定这是否值得一个完整的答案!我更喜欢前者,尤其是在涉及多个类型参数时(后者可能吗?)。

于 2012-04-16T00:22:36.070 回答
2

我认为'a t语法更惯用(它在几乎所有 MSDN 示例中都使用,并且由编译器发出,将为签名文件生成该语法)

数组有一个类似的例子

int[] , int array

具体参数的'a t语法也更好 -

int list, List<int>

所以一些一致性主张'a t

于 2012-04-16T00:47:21.137 回答
1

我会说区别在于可读性。对于一个参数,'语法并不过分令人困惑,但是当您获得它们的列表时,阅读尖括号版本会变得更加容易。

于 2012-04-16T00:36:45.023 回答