Confrontando i casi discriminati dell'Unione discriminati tramite la corrispondenza del modello
-
12-12-2019 - |
Domanda
In primo luogo, scuse per il titolo povero - non capisco abbastanza F # per descrivere il problema meglio.
Considera questo semplice 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"
.
Sto raffigurando denaro in diverse valute e sovraccaricare l'operatore (+) in modo che io possa tranquillamente fare soldi + soldi.Tuttavia, se ho molte valute, allora la dichiarazione della partita diventerà noiosa scrivere.C'è un modo per esprimere qualcosa come:
match first, second with
| _(x), _(y) -> _(x + y)
.
o c'è un modo diverso per raggiungere lo stesso risultato?Ho considerato e scartato le unità di misura dovute alle limitazioni descritte qui .
Soluzione
funziona per te?
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"
. Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow