F#中区分联盟类型的区别

时间:2016-03-04 03:37:28

标签: f#

我正在阅读关于F#并查看人们的源代码,我有时会看到

Type test =
   | typeone
   | typetwo 

有时候我会看到

type test = typeone | typetwo 

其中一个之前有一个管道而另一个没有。起初我认为一个是enum vs歧视联盟,但我认为他们是一样的。如果有人可以解释差异吗?

3 个答案:

答案 0 :(得分:7)

没有区别。这些符号完全相同。前导管道字符是可选的。

让第一个管道可选有助于使代码在不同情况下看起来更好。特别是,如果我的类型有很多种情况,并且每种情况都有大量数据,那么将它们放在不同的行上是有意义的。在这种情况下,引导管使它们看起来在视觉上对齐,以便读者将它们视为一个逻辑单元:

type Large =
  | Case1 of int * string
  | Case2 of bool
  | SomeOtherCase
  | FinalCase of SomeOtherType

另一方面,如果我只需要两到三个案例,我可以把它们放在一行上。在这种情况下,导管只会妨碍,造成一种混乱的感觉:

type QuickNSmall = One | Two | Three

答案 1 :(得分:5)

没有区别。

在规范中,第一个|是可选的。

规范的相关部分是:

  

union-type-cases:='|'opt union-type-case'|' ......'|'   联合型的情况下

枚举需要为案例提供明确的值,例如

Type test =
   | typeone = 1
   | typetwo = 2

答案 2 :(得分:2)

如前所述,前导|是可选的。

其他答案中的示例没有显示这一点,因此值得补充的是,即使对于多行区分联合,您也可以省略它(并在定义单行联合时包含它):

type Large =
    Case1 of int * string
  | Case2 of bool
  | SomeOtherCase
  | FinalCase of SomeOtherType

type QuickNSmall = | One | Two | Three

我认为大多数人只是发现这些丑陋(包括我自己!)所以他们通常以你在其他答案中看到的方式编写。