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

Luk*_* Xu 4 f#

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

Type test =
   | typeone
   | typetwo 
Run Code Online (Sandbox Code Playgroud)

有时候我会看到

type test = typeone | typetwo 
Run Code Online (Sandbox Code Playgroud)

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

Fyo*_*kin 7

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

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

type Large =
  | Case1 of int * string
  | Case2 of bool
  | SomeOtherCase
  | FinalCase of SomeOtherType
Run Code Online (Sandbox Code Playgroud)

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

type QuickNSmall = One | Two | Three
Run Code Online (Sandbox Code Playgroud)


Joh*_*mer 5

没有区别.

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

规范的相关部分是这样的:

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

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

Type test =
   | typeone = 1
   | typetwo = 2
Run Code Online (Sandbox Code Playgroud)