2012-10-02 6 views
5

Zuerst entschuldigen Sie sich für den schlechten Titel - ich verstehe nicht genug F #, um das Problem besser zu beschreiben.Vergleichen von F # diskriminierten Gewerkschaftsinstanzen über Mustervergleich

Betrachten Sie diese einfach 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" 

ich repräsentieren Geld in verschiedenen Währungen und eine Überlastung des Operators (+), so dass ich sicher Geld + Geld machen kann. Wenn ich jedoch viele Währungen habe, wird es mühsam, die Spielanweisung zu schreiben. Gibt es eine Möglichkeit, etwas auszudrücken wie:

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

Oder gibt es einen anderen Weg, um das gleiche Ergebnis zu erzielen? Ich habe aufgrund der beschriebenen Einschränkungen here Mengeneinheiten berücksichtigt und verworfen.

+4

Sollten Sie nicht für diese in F # unter Verwendung von Maßeinheiten sein? –

+0

Ich würde gerne Maßeinheiten verwenden, aber weil das Maß zur Laufzeit gelöscht wird, bietet es mir keine Sicherheit beim Lesen von Daten aus externen Quellen (siehe verknüpfte Frage). Ich würde gerne falsch bewiesen werden! – Akash

Antwort

15

Funktioniert das für Sie?

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

Verdammt! Ein-Fall-DUs, ich denke, sie verdienen wirklich mehr Aufmerksamkeit :) – Bartosz

+0

Danke, ich denke, das wird den Trick machen. – Akash