2012-10-02 34 views
5

首先,對於糟糕的標題表示歉意 - 我不明白足夠的F#來更好地描述問題。通過模式匹配來比較F#歧視聯合實例

考慮一個簡單的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" 

我代表不同的貨幣資金,以及超載(+)運算符,這樣我可以有把握地做金錢+錢。但是,如果我有很多貨幣,那麼匹配語句就會變得單調乏味。有什麼方式表達類似的:

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

或者是否有不同的方式來實現相同的結果?由於here的限制,我考慮並丟棄了度量單位。

+4

你不應該在F#中使用這個單位嗎? –

+0

我喜歡使用度量單位,但由於度量在運行時被刪除,因此在從外部來源讀取數據時不會提供任何安全性(請參閱鏈接的問題)。我很想被證明是錯的! – Akash

回答

15

這是否適合您?

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

該死!單箱DU,我認爲他們真的值得更多的關注:) – Bartosz

+0

謝謝,我認爲這將做到這一點。 – Akash