F#中的t<'a>
和'a t
之间的含义是否有任何区别?即使在申报之后,它们是否可以互换使用?
答案 0 :(得分:14)
没有区别,是的,即使在声明之后它们也可以互换使用。
但请注意F# Component Design Guidelines建议(第4.2节):
请考虑优先使用泛型(
Foo<T>
)的前缀语法 postfix语法(T Foo
),有四个值得注意的例外(list
,option
,array
,ref
)。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) t
与t<'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)
我想说的区别在于可读性。对于一个参数,'
语法不会过于混乱,但是当您获得它们的列表时,更容易阅读尖括号版本。