繁体   English   中英

歧视的联盟并让绑定

[英]Discriminated Unions and let bindings

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绑定(在声明成员之前),但遗憾的是,对于受歧视的联合,这不受支持。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM