通过模式匹配比较F#判别并集实例

通过模式匹配比较F#判别并集实例,f#,pattern-matching,discriminated-union,F#,Pattern Matching,Discriminated Union,首先,为这个糟糕的标题道歉——我没有足够的理解来更好地描述这个问题 考虑一下这个简单的DU: 输入货币= |十进制美元 |十进制英镑 |十进制欧元 静态成员(+)(第一个:货币,第二个:货币)= 先配,后配 |美元(x),美元(y)->美元(x+y) |英镑(x)、英镑(y)->英镑(x+y) |欧元(x),欧元(y)->欧元(x+y) |使用“不同货币”时发生故障 我用不同的货币表示货币,并重载(+)操作符,这样我就可以安全地执行money+money。然而,如果我有很多货币,那么匹配语句

首先,为这个糟糕的标题道歉——我没有足够的理解来更好地描述这个问题

考虑一下这个简单的DU:

输入货币=
|十进制美元
|十进制英镑
|十进制欧元
静态成员(+)(第一个:货币,第二个:货币)=
先配,后配
|美元(x),美元(y)->美元(x+y)
|英镑(x)、英镑(y)->英镑(x+y)
|欧元(x),欧元(y)->欧元(x+y)
|使用“不同货币”时发生故障
我用不同的货币表示货币,并重载(+)操作符,这样我就可以安全地执行money+money。然而,如果我有很多货币,那么匹配语句将变得乏味。有没有什么表达方式,比如:

第一个匹配,第二个匹配
|(x),(y)->(x+y)

还是有不同的方法可以达到相同的结果?由于上述限制,我考虑并放弃了度量单位。

这对您有用吗

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" 

该死单例DU,我认为它们确实值得更多的关注:)你不应该在F#中使用度量单位吗?我很想使用度量单位,但因为度量在运行时被删除,所以在从外部源读取数据时,它不能为我提供任何安全性(参见链接问题)。我希望被证明是错的!