2
let ``one`` x = One(x)
type Number = 
| One of int
| Two
with 
    member this.Hi x = ``one`` x

基本上,我想定义一个引用可区分联合的绑定,并且我想在该联合的扩展之一中使用它,因为我知道由于某些奇怪的原因let您不能在联合内定义绑定。let双勾是为了强调。

实际上,我想要的是为工会成员制作一种简洁的构造函数。我知道有区别的联合不能有构造函数,但是有没有办法做到这一点,也许不使用let上面的绑定?

4

1 回答 1

9

您可以使用类型扩展来定义类型,然后编写一些 let 绑定(顶级或在模块中),然后将member声明添加到类型:

type Number =  
  | One of int
  | Two 

let one x = One(x) 

type Number with
  member this.Hi x = one x 

如果你把它写在一个文件中,那么这是一个内在类型扩展,这意味着代码将被编译为带有成员的标准类型(并且这些成员将可以直接从 C# 中使用)。如果您在另一个文件中添加了扩展名,那么情况会有所不同(更像是 C# 扩展方法)。

对于 F# 类声明,您还可以let在类内部使用本地绑定(在声明成员之前),但遗憾的是,这不支持可区分联合。

于 2012-10-04T15:41:25.277 回答