通过模式匹配比较F#区分联合实例

时间:2012-10-02 08:31:29

标签: f# pattern-matching discriminated-union

首先,为糟糕的标题道歉 - 我不太了解F#来更好地描述问题。

考虑这个简单的DU:

type Money =
    | USD of decimal
    | GBP of decimal
    | EUR of decimal
    static member (+) (first: Money, second: Money) =
        match first, second with 
        | USD(x), USD(y) -> USD(x + y)
        | GBP(x), GBP(y) -> GBP(x + y)
        | EUR(x), EUR(y) -> EUR(x + y)
        | _ -> failwith "Different currencies"

我用不同的货币代表货币,并超载(+)运营商,以便我可以安全地做Money + Money。但是,如果我有很多货币,那么匹配声明将变得乏味。有没有办法表达类似的东西:

match first, second with 
| _(x), _(y) -> _(x + y)

或者有不同的方法可以达到相同的效果吗?由于here描述的限制,我已经考虑并放弃了计量单位。

1 个答案:

答案 0 :(得分:15)

这对你有用吗?

type Kind = | USD | GBP | EUR

type Money = 
    | Money of Kind * decimal 
    static member (+) (first: Money, second: Money) = 
        match first, second with  
        | Money(k1,x), Money(k2,y) when k1=k2 -> Money(k1, x + y) 
        | _ -> failwith "Different currencies"