Properties 如何将setter添加到F中受歧视的联合中#

Properties 如何将setter添加到F中受歧视的联合中#,properties,f#,discriminated-union,Properties,F#,Discriminated Union,我想把setter属性添加到有歧视的联合中,我应该怎么做 f、 e: 类型因子= |客体价值 |字符串范围 设可变myProperty=123 成员:this.MyProperty 使用get()=myProperty 和set(value)=myProperty为什么不使用类和活动模式: type _Factor = | Value_ of obj | Range_ of string type Factor(arg:_Factor) = l

我想把setter属性添加到有歧视的联合中,我应该怎么做

f、 e:

类型因子=
|客体价值
|字符串范围
设可变myProperty=123
成员:this.MyProperty
使用get()=myProperty

和set(value)=myProperty为什么不使用类和活动模式:

type _Factor =    
    | Value_     of obj
    | Range_     of string

type Factor(arg:_Factor) =

    let mutable myProperty = 123
    member this._DU = arg
    member this.MyProperty
        with get() = myProperty
        and set(value) = myProperty <- value

let (|Value|Range|) (arg:Factor) = 
    match arg._DU with
    |Value_(t) -> Value(t)
    |Range_(t) -> Range(t)
类型_系数=
|obj的值
|字符串的范围
类型因子(参数:_因子)=
设可变myProperty=123
请记住这一点。_DU=arg
成员:this.MyProperty
使用get()=myProperty
和设置(值)=myProperty值(t)
|范围(t)->范围(t)

这显然要慢得多,但它可以让你做你想做的事

我还不太熟悉F#,但我想你做不到,这没有任何意义。从工会的名称可以看出,受歧视的工会是工会。它们代表了某种选择。你试图把一些状态融入其中。你想达到什么目的?用例是什么

也许你所需要的一切就是给你的DU添加额外的“参数”,即如果你有

type DU = 
    | A of int
    | B of string
如果您想添加int类型的setter,则可以通过以下方式扩展DU:

type DU = 
    | A of int * int
    | B of string * int

    member x.Set i =
        match x with
        | A(a1, a2) -> A(a1, i)
        | B(b1, b2) -> B(b1, i)

以下是我可能的做法:

type Value = { value: obj; mutable MyProperty: int }
type Range = { range: string; mutable MyProperty: int }

type Factor =    
    | Value     of Value
    | Range     of Range

    member this.MyProperty
        with get() = 
            match this with
            | Value { MyProperty=myProperty }
            | Range { MyProperty=myProperty } -> myProperty
        and set(myProperty) = 
            match this with
            | Value x -> x.MyProperty <- myProperty
            | Range x -> x.MyProperty <- myProperty
type Value={Value:obj;可变MyProperty:int}
类型范围={Range:string;可变MyProperty:int}
类型系数=
|价值的价值
|射程
成员:this.MyProperty
使用get()=
与此匹配
|值{MyProperty=MyProperty}
|范围{MyProperty=MyProperty}->MyProperty
并设置(myProperty)=
与此匹配
|值x->x.MyProperty x.MyProperty obj;MyProperty=0}
v、 我的财产
printfn“值的值=%A,MyProperty=%i”值记录。MyProperty
| _ -> 
printfn“等”

我在类似于您的场景中使用了此技术,并在FsEye的手表模型中获得了令人满意的结果:。

我认为您可能应该使用一个真正的类来实现此目的。如果您使用tree,则使用区分联合非常方便。对于我来说,更可取的做法是,尝试找到如何将setter添加到歧视联合-1xy问题中的方法。描述您试图解决的问题,而不是您无法解决的解决方案。我尝试解析并执行excel formulla。excel中存在volitile函数,我需要在我的树上标记此表达式。+1我一直在想如何做同样的事情(在某些情况下,它可能对性能非常有用)
type Value = { value: obj; mutable MyProperty: int }
type Range = { range: string; mutable MyProperty: int }

type Factor =    
    | Value     of Value
    | Range     of Range

    member this.MyProperty
        with get() = 
            match this with
            | Value { MyProperty=myProperty }
            | Range { MyProperty=myProperty } -> myProperty
        and set(myProperty) = 
            match this with
            | Value x -> x.MyProperty <- myProperty
            | Range x -> x.MyProperty <- myProperty
let v = Value {value="hi":>obj ; MyProperty=0 }
v.MyProperty <- 2

match v with
| Value { value=value } as record ->
    printfn "Value of value=%A with MyProperty=%i" value record.MyProperty
| _ -> 
    printfn "etc."