F#中t <'a>和'at之间有什么区别?

sbl*_*lom 12 f#

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

Ste*_*sen 14

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

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

考虑使用前缀语法泛型(Foo<T>)优先于后缀语法(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) tvs. ,您将收到编译器警告t<'a,'b>.

在我们参与其中时,请注意同一指南第3.1节中的以下建议:

在公共API中使用PascalCase作为通用参数名称,包括F#-facing库.特别是,使用T,U,T1,T2等名称作为任意通用参数,当特定名称有意义时,对于F#表面库,使用Key,Value,Arg等名称(但不是例如TKey).

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