2012-10-02 17 views
5

En primer lugar, me disculpo por el título pobre: ​​no entiendo lo suficiente F # para describir mejor el problema.Comparación de instancias sindicales discriminadas F # mediante la coincidencia de patrones

consideran este sencillo 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" 

Estoy representando el dinero en diferentes monedas, y la sobrecarga de la (+) operador, de modo que pueda hacer dinero de forma segura + dinero. Sin embargo, si tengo muchas monedas, la declaración del partido será tediosa de escribir. ¿Hay alguna forma de expresar algo así como:

match first, second with 
| _(x), _(y) -> _(x + y) 

¿O existe una forma diferente de lograr el mismo resultado? He considerado y descartado unidades de medida debido a las limitaciones descritas here.

+4

¿No deberías estar usando unidades de medida para esto en F #? –

+0

Me encantaría usar unidades de medida, pero debido a que la medida se borra durante el tiempo de ejecución, no me ofrece seguridad cuando leo datos de fuentes externas (consulte la pregunta relacionada). ¡Me encantaría que se demuestre que estoy equivocado! – Akash

Respuesta

15

¿Esto funciona para usted?

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" 
+4

¡Maldición! DU de un solo caso, creo que realmente merecen más atención :) – Bartosz

+0

Gracias, creo que eso hará el truco. – Akash

Cuestiones relacionadas