Gre*_*Ros 2 .net f# functional-programming
let ``one`` x = One(x)
type Number =
| One of int
| Two
with
member this.Hi x = ``one`` x
Run Code Online (Sandbox Code Playgroud)
基本上,我想定义一个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
Run Code Online (Sandbox Code Playgroud)
如果你在一个文件中写这个,那么这是一个内在的类型扩展,这意味着代码将被编译为带有成员的标准类型(并且成员将直接从C#中使用).如果您在另一个文件中添加了扩展名,那么这将是不同的(更像是C#扩展方法).
对于F#类声明,您还可以let在类中使用本地绑定(在声明成员之前),但遗憾的是,对于受歧视的联合,这不受支持.