2012-10-02 25 views
5

Thứ nhất, xin lỗi cho tiêu đề nghèo - Tôi không hiểu đủ F # để mô tả vấn đề tốt hơn.So sánh F # trường hợp công đoàn phân biệt đối xử thông qua kết hợp mẫu

Cân nhắc DU đơn giản này:

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" 

Tôi đại diện cho tiền bằng ngoại tệ khác nhau, và quá tải (+) điều hành vì vậy mà tôi có thể yên tâm làm tiền + tiền. Tuy nhiên, nếu tôi có nhiều loại tiền tệ thì câu lệnh trận đấu sẽ trở nên tẻ nhạt để viết. Có cách nào để thể hiện điều gì đó như:

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

Hoặc có cách nào khác để đạt được kết quả tương tự không? Tôi đã xem xét và loại bỏ các đơn vị đo lường do các giới hạn được mô tả here.

+4

Bạn không nên sử dụng đơn vị đo lường cho điều này trong F #? –

+0

Tôi rất muốn sử dụng đơn vị đo lường, nhưng vì biện pháp bị xóa khi chạy nó không cung cấp cho tôi bất kỳ sự an toàn nào khi đọc dữ liệu từ các nguồn bên ngoài (xem câu hỏi được liên kết). Tôi rất muốn được chứng minh là sai! – Akash

Trả lời

15

Tính năng này có phù hợp với bạn không?

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

Chết tiệt! DU đơn trường hợp, tôi nghĩ rằng họ thực sự đáng chú ý hơn :) – Bartosz

+0

Cảm ơn, tôi nghĩ rằng sẽ làm các trick. – Akash

Các vấn đề liên quan