t< a>之间的任何差异。和'在F#?

时间:2012-04-16 00:17:48

标签: f#

F#中的t<'a>'a t之间的含义是否有任何区别?即使在申报之后,它们是否可以互换使用?

4 个答案:

答案 0 :(得分:14)

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

但请注意F# Component Design Guidelines建议(第4.2节):

  

请考虑优先使用泛型(Foo<T>)的前缀语法   postfix语法(T Foo),有四个值得注意的例外(list,   optionarrayref)。

     

F#继承了后缀ML样式的命名   通用类型,例如“int list”以及前缀.NET样式,例如:   “list<int>”。你应该更喜欢.NET风格,除了四种   具体类型。对于F#列表,请使用后缀形式:“int list”   而不是“list<int>”。对于选项,请使用后缀形式:“int option”   而不是“option<int>”。对于数组,请使用语法名称   “int[]”而不是“int array”或“array<int>”。对于refs,   使用“int ref”而不是“ref<int>”或“Ref<int>”。对于所有其他   类型,使用前缀形式:“HashSet<int>”,“Dictionary<string,int>”,   因为这符合.NET标准

此外,如果您使用ML样式的通用参数列表表示法,则会收到编译器警告,例如: ('a,'b) tt<'a,'b>

在我们处理此问题时,请在同一指南的Section 3.1中注明以下建议:

  

在公共API中使用PascalCase作为通用参数名称,   包括F#-facing库。特别是,使用像T,U这样的名字,   T1,T2用于任意通用参数,以及具体名称时   感觉,然后对于F#表面库,使用Key,Value,Arg等名称   (但不是例如TKey)。

(虽然我个人倾向于忽略F#面向公共图书馆的这一建议。)

答案 1 :(得分:3)

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

答案 2 :(得分:2)

我认为'a t语法更加惯用(几乎所有MSDN示例都使用它,编译器发出的语法会为签名文件生成语法)

数组有一个类似的例子

int[] , int array

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

int list, List<int>

所以'a t

的一致性存在争议

答案 3 :(得分:1)

我想说的区别在于可读性。对于一个参数,'语法不会过于混乱,但是当您获得它们的列表时,更容易阅读尖括号版本。