在F#中,某些类型具有特殊的通用语法(我不确定它叫什么),以便您可以执行以下操作:
int list // instead of List<int>
int option // instead of Option<int>
答案 0 :(得分:5)
在“通用类型”下:
通用类型
类型参数泛型名称|
'a list
或
通用类型名称<类型参数列表> |
list<'a>
和“构造类型”:
构造类型(提供了特定类型参数的通用类型)
类型参数通用类型名称
或
通用类型名称<类型参数列表>
type dave<'a> = {
V : 'a
};;
let stringDave: dave<string> = { V = "string" };;
//val stringDave : dave<string> = {V = "string";}
let intDave : int dave = { V = 123 };;
//val intDave : dave<int> = {V = 123;}
答案 1 :(得分:3)
首先,必须注意list
和List
之间的区别与前缀和后缀语法没有直接关系。类型'T list
只是类型List<'T>
的别名。来自F# core source code:
type List<'T> =
| ([]) : 'T list
| (::) : Head: 'T * Tail: 'T list -> 'T list
interface System.Collections.Generic.IEnumerable<'T>
interface System.Collections.IEnumerable
interface System.Collections.Generic.IReadOnlyCollection<'T>
interface System.Collections.Generic.IReadOnlyList<'T>
and 'T list = List<'T>
此外,我们可以表达任何通用类型的前缀或后缀。
将这两件事结合在一起,就意味着所有这些类型都是有效且等效的。
int list
int List
list<int>
List<int>
这适用于任何其他.NET类型,例如int System.Collections.Generic.HashSet
和您自己的类型:
type MyCoolType<'a> = A | B
let x : int MyCoolType = A
// compiles ✔
为了与OCaml(F#最初基于的语言)兼容,似乎都存在小写类型注释和后缀语法。