2012-10-02 15 views
5

ile eşleştirerek karşılaştırarak Öncelikle, kötü başlıktan özür dilerim - sorunu daha iyi tanımlamak için yeterince F # anlamıyorum.F # ayrımcılıklı sendika örneklerini

bu basit DU düşünün:

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" 

farklı para birimlerinde para temsil ve güvenle Para + Para yapmak, böylece (+) operatörü aşırı ediyorum. Ancak, çok sayıda para birimim varsa, eşleşme ifadesi yazmak için can sıkıcı olacaktır.

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

Veya aynı sonucu elde etmek farklı bir yolu vardır: Böyle bir şey ifade edecek bir yolu var mı? here tarif edilen sınırlamalar nedeniyle ölçü birimlerini düşündüm ve attım.

+4

F # biriminde bunun için ölçü birimlerini kullanmıyor musunuz? –

+0

Ölçü birimlerini kullanmayı çok isterim, ancak ölçüm çalışma zamanında silindiği için harici kaynaklardan veri okurken bana herhangi bir güvenlik sunmuyor (bağlantılı soruya bakın). Yanlış olduğunu kanıtlamak isterim! – Akash

cevap

15

Bu sizin için çalışıyor mu?

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

Lanet! Tek vaka DU'ler, sanırım onlar daha fazla dikkati hak ediyorlar :) – Bartosz

+0

Teşekkürler, bu hile yapacak. – Akash