Comparer des instances syndicales discriminées par la correspondance des motifs
-
12-12-2019 - |
Question
Tout d'abord, excuses pour le mauvais titre - je ne comprends pas assez de F # pour décrire le problème mieux.
Considérez cette simple 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"
Je représente de l'argent dans différentes devises et surcharge l'opérateur (+) afin que je puisse faire de l'argent en toute sécurité + argent.Cependant, si j'ai de nombreuses devises, la déclaration de match deviendra fastidieuse à écrire.Y a-t-il un moyen d'exprimer quelque chose comme:
match first, second with
| _(x), _(y) -> _(x + y)
ou y a-t-il un moyen différent d'obtenir le même résultat?J'ai envisagé et jeté des unités de mesure en raison des limitations décrites Ici .
La solution
Est-ce que cela fonctionne pour vous?
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"
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow