2012-10-02 13 views
5

के माध्यम से एफ # भेदभावित यूनियन उदाहरणों की तुलना करना सबसे पहले, खराब शीर्षक के लिए क्षमा चाहते हैं - मुझे समस्या का बेहतर वर्णन करने के लिए पर्याप्त 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" 

मैं विभिन्न मुद्राओं में पैसे का प्रतिनिधित्व कर रहा हूँ, और (+) ऑपरेटर ओवरलोडिंग ताकि मैं सुरक्षित रूप से पैसे + धन कर सकते हैं। हालांकि, अगर मेरे पास कई मुद्राएं हैं तो मैच स्टेटमेंट लिखने के लिए कठिन हो जाएगा। क्या कुछ ऐसा व्यक्त करने का कोई तरीका है:

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

या क्या एक ही परिणाम प्राप्त करने का कोई अलग तरीका है? मैंने here वर्णित सीमाओं के कारण माप की इकाइयों को माना और त्याग दिया है।

+4

क्या आप एफ # में इसके लिए माप की इकाइयों का उपयोग नहीं करना चाहिए? –

+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

अरे! एकल मामले डीयू, मुझे लगता है कि वे वास्तव में अधिक ध्यान देने योग्य हैं :) – Bartosz

+0

धन्यवाद, मुझे लगता है कि यह चाल करेगा। – Akash

संबंधित मुद्दे