歧视工会,让约束


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

基本上,我想定义一个引用可区分联合的let绑定,我想在该联合的一个扩展中使用它,因为我知道由于某种奇怪的原因,您无法在联合中定义let绑定。双勾号用于强调。

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

可以使用类型扩展来定义类型,然后编写多个 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绑定(在声明成员之前),但遗憾的是,可区分联合不支持这样做。

相关内容

  • 没有找到相关文章

最新更新