Aka*_*ash 5 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"
Run Code Online (Sandbox Code Playgroud)
我用不同的货币代表货币,并超载(+)运营商,以便我可以安全地做Money + Money.但是,如果我有很多货币,那么匹配声明将变得乏味.有没有办法表达如下:
match first, second with
| _(x), _(y) -> _(x + y)
Run Code Online (Sandbox Code Playgroud)
或者有不同的方法来实现相同的结果?由于此处描述的限制,我已经考虑并放弃了计量单位.
Bri*_*ian 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"
Run Code Online (Sandbox Code Playgroud)