2012-03-19 24 views
6
# type foo = Foo of int * int 
# let t = (1, 2) 
# Foo t 
Error: The constructor Foo expects 2 argument(s), 
    but is applied here to 1 argument(s) 

साथ एक प्रकार प्रकार निर्माता का उपयोग कैसे यह है कि मैं Foo (1, 2) करना चाहिए है कि त्रुटि भी टी उचित प्रकार है से बचने के लिए?सिर्फ एक टपल मूल्य

उत्तर

10

यह मेरी राय में ओकैमल वाक्यविन्यास के परेशान भागों में से एक है। जिस तरह से दिखता है, उसके बावजूद, कन्स्ट्रक्टर फू को इसके तर्क के रूप में 2-ट्यूपल की आवश्यकता नहीं होती है। यह कोष्ठक में दो मानों की आवश्यकता है, लेकिन वे एक tuple नहीं हैं। तो यह बस मामला है कि t में गलत प्रकार है। इस काम करने के लिए जिस तरह से कहने के लिए है:

let (a, b) = t in Foo (a, b) 

समस्या वास्तव में उस कोष्ठक दो अलग अलग चीजों के लिए इस्तेमाल किया जा रहा है (या तो मैं दावा करते हैं) है। एक बार जब आप इसका इस्तेमाल कर लेते हैं तो इससे निपटना मुश्किल नहीं होता है।

संपादित: यदि आप चाहते निर्माता फू दो अलग-अलग मूल्यों से एक भी टपल लेने के लिए, बल्कि, आप इसे इस प्रकार परिभाषित कर सकते हैं:

type foo = Foo of (int * int) 

फिर उसे अपने मूल कोड के बाकी होगा काम।

+1

दो से अधिक चीजों के लिए अभिभावक का उपयोग किया जाता है! वे ओपी का उदाहरण भी काम करते हैं-अगर वह केवल 'टाइप * int' (int * int) ' –

+0

हां बदलता है, तो मैंने इसे टिप्पणी करने से ठीक पहले एक संपादन में जोड़ा (मुझे नहीं कि मुझे क्रेडिट या कुछ भी प्राप्त करने की आवश्यकता है :-)। स्पष्टीकरण के लिए –

+0

धन्यवाद! – Ricardo

4

ध्यान दें कि Foo of (a * b) और Foo of a * b के बीच भेद दक्षता कारणों के लिए है: Foo of (a * b) एक तर्क है जो एक टपल, ढेर में दो तत्वों के लिए सूचक है है। Foo of a * b में दो तर्क हैं जो सीधे टैग के साथ पैक होते हैं, एक संकेत से परहेज करते हैं। सामान्य रूप में

type ('a, 'b) assoc_list = 
    | Nil 
    | Cons of 'a * 'b * ('a, 'b) assoc_list 
बेशक

:

यह भी कारण है कि, उदाहरण के लिए, एल्गोरिदम कि (लिंक्ड सूची बाल्टी के साथ उदाहरण hashtables के लिए) संघ सूचियों का उपयोग कभी कभी अपने स्वयं के डेटाप्रकार बजाय ('a * 'b) list पुन: उपयोग की परिभाषित है उच्च स्तरीय मामले ऐसी विशेषज्ञताएं बहुत महत्वपूर्ण नहीं हैं (और कोड पुन: उपयोग में बाधा डाल सकती हैं), लेकिन जब भी आपको वास्तव में स्मृति प्रतिनिधित्व पर कड़े नियंत्रण की आवश्यकता होती है तो ऐसे तकनीकी विवरणों में उतरने में सक्षम होना अच्छा होता है।

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