2012-10-04 71 views
2
let ``one`` x = One(x) 
type Number = 
| One of int 
| Two 
with 
    member this.Hi x = ``one`` x 

基本上,我想定义一个let绑定引用可识别联合,我想在扩展到工会的一个使用它,因为我知道你不能定义let出于某种奇怪的原因,在工会内部进行绑定。双重蜱是强调。识别联合,让绑定

其实,我想要的是为工会的成员做一个简洁的构造函数。我知道歧视工会不能有建设者,但有没有办法做到这一点,也许没有使用上面的绑定let

回答

9

您可以使用type extensions定义类型,然后写一个数字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绑定(在声明成员之前),但遗憾的是这不适用于区分联合。

+0

谢谢!这工作得很好! – GregRos