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

5

首先,对于标题表达不清我深感抱歉——我不了解足够的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)

还有其他实现相同结果的方法吗?由于文档 这里中描述的限制,我已经考虑并放弃了度量单位。


4
你不应该在 F# 中使用度量单位吗? - J D
我很想使用度量单位,但由于度量在运行时被擦除,因此在从外部源读取数据时无法提供任何安全性(请参见链接的问题)。我很想被证明是错误的! - Akash
1个回答

16

这对你有用吗?

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" 

4
该死!单例DUs,我认为它们真的应该得到更多关注 :) - Bartosz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接