簡體   English   中英

如何將Setter添加到F#中的已區分工會

[英]How add setter to to discriminated unions in F#

我想將setter屬性添加到有區別的工會中,我該怎么做?

fe:

type Factor =    
    | Value     of Object
    | Range     of String

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

這是我可能的處理方法:

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."

我在與您類似的情況下使用了該技術,並在FsEye的手表模型中獲得了令人滿意的結果: http : //code.google.com/p/fseye/source/browse/tags/2.0.0-beta1/FsEye/WatchModel。 fs

為什么不使用類和活動模式:

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)

這顯然會明顯慢一些,但是它可以讓您做自己想做的事情

我對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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM