2012-10-02 14 views
5

In primo luogo, scuse per il titolo scarso - Non capisco abbastanza F # per descrivere meglio il problema.Confronto tra istanze di unione discriminata F # tramite corrispondenza di pattern

considerare 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 rappresentando denaro in diverse valute, e sovraccarico l'operatore (+) in modo che posso tranquillamente fare soldi + soldi. Tuttavia, se ho molte valute, la dichiarazione della partita diventerà noiosa da scrivere. C'è un modo per esprimere qualcosa del tipo:

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

Oppure esiste un modo diverso per ottenere lo stesso risultato? Ho considerato e scartato le unità di misura a causa delle limitazioni descritte here.

+4

Non dovresti utilizzare le unità di misura per questo in F #? –

+0

Mi piacerebbe utilizzare le unità di misura, ma poiché la misura viene cancellata in fase di esecuzione non mi offre alcuna sicurezza durante la lettura dei dati da fonti esterne (vedi domanda collegata). Mi piacerebbe essere smentito! – Akash

risposta

15

Funziona per voi?

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

Dannazione! DU a singolo caso, penso che meritino davvero più attenzione :) – Bartosz

+0

Grazie, penso che farà il trucco. – Akash