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 .

Était-ce utile?

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
scroll top