2012-10-02 8 views
5

まず、貧しいタイトルのためのお詫び - 私は問題をよりよく説明するのに十分なF#を理解していません。私は、異なる通貨でお金を表現する、と私は無事マネー+お金を行うことができるように(+)演算子をオーバーロードしています パターンマッチングによるF#の識別された共用体インスタンスの比較

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" 

は、この単純なDUを考えてみましょう。しかし、もし私が多くの通貨を持っているなら、マッチステートメントは書くのが面倒になるでしょう。

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

関連する問題