我可以对自己的类型使用特殊的通用语法吗?

时间:2019-01-17 12:26:29

标签: generics f#

在F#中,某些类型具有特殊的通用语法(我不确定它叫什么),以便您可以执行以下操作:

int list // instead of List<int>
int option // instead of Option<int>
  • 这种语法叫什么?
  • 我可以为我自己的类型启用它吗?

2 个答案:

答案 0 :(得分:5)

MSDN on F# Types

中有介绍

在“通用类型”下:

  

通用类型

     

类型参数泛型名称| '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)

首先,必须注意listList之间的区别与前缀和后缀语法没有直接关系。类型'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#最初基于的语言)兼容,似乎都存在小写类型注释和后缀语法。