我正在阅读关于F#并查看人们的源代码,我有时会看到
Type test =
| typeone
| typetwo
有时候我会看到
type test = typeone | typetwo
其中一个之前有一个管道而另一个没有。起初我认为一个是enum vs歧视联盟,但我认为他们是一样的。如果有人可以解释差异吗?
答案 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
我认为大多数人只是发现这些丑陋(包括我自己!)所以他们通常以你在其他答案中看到的方式编写。