2012-10-02 11 views
7

मैं एक समारोह, कि एक पूर्णांक और एक त्रिक लेता है और दिए गए स्थान (हिक्की की किताब से व्यायाम 5.3) में त्रिक का एक तत्व देता है लिखने के लिए कोशिश कर रहा हूँ में अप्रत्याशित प्रकार मेल नहीं खाता। ट्रिपलेट को विभिन्न प्रकार के तत्वों को शामिल करने में सक्षम होना चाहिए।OCaml tuples

मैंने सोचा, कि अगर मैं 3 छोटे कार्यों को लिखता हूं, तो प्रत्येक ट्रिपल का एक विशिष्ट तत्व लौटाता है और मेरा बड़ा फ़ंक्शन तदनुसार उनमें से एक को वापस कर देता है, तो यह चाल करेगा, लेकिन यह काम नहीं करेगा।

मैं इस "ईटा-विस्तार" की अवधारणा के साथ बेला के की कोशिश की है, लेकिन मैं इसे नहीं मिला।

let nth1 (a, _, _) = a 
let nth2 (_, b, _) = b 
let nth3 (_, _, c) = c 

let nth i = match i with 
    | 1 -> nth1 
    | 2 -> nth2 
    | _ -> nth3 

let main = printf "%d\n" (nth 1 ("hello", 2, 'c')) 

तो इसे यहां "2" लिखना चाहिए। कोई सलाह?

+1

संपादन क्योंकि यह वास्तव में मूल्य प्रतिबंध नहीं है, यह इस तरह के पाठकों को भ्रमित करेंगे बुला। –

उत्तर

6

यह आमतौर पर कोड लिखने से पहले प्रकार के बारे में सोचने के लिए मदद करता है। आपके फ़ंक्शन का प्रस्तावित प्रकार क्या है?

+0

ठीक है, मुझे कुछ "int -> ((ए * बी * सी) -> (ए या बी या सी)" मिला है, "जो स्पष्ट रूप से गलत है ... त्रुटि को उजागर करने के लिए धन्यवाद! – user1714986

+0

मुझे लगता है कि यह अभ्यास का मुद्दा है। शायद थोड़ा स्नीकी, लेकिन अच्छा। –

7

अपने प्रश्न का बुनियादी जवाब:

OCaml में, जिस तरह से काम करता है प्रकार प्रणाली nth केवल एक एकल प्रकार लौटने के लिए बाध्य करेगा। आप जो चाहते हैं वह चौराहे प्रकार जैसा कुछ है, लेकिन ओकैमल के लिए स्थैतिक प्रकार अर्थशास्त्र केवल nth को केवल एकल प्रकार लौटने के लिए मजबूर करेगा। इसका अपवाद यह है कि आपका ट्यूपल उस मामले में खराब हो जाना चाहिए जहां तत्व एक ही प्रकार का होता है। nth की परिभाषा की वजह से,

# let nth1 (a,_,_) =a;; 
val nth1 : 'a * 'b * 'c -> 'a = <fun> 
# let nth2 (_,b,_) = b;; 
val nth2 : 'a * 'b * 'c -> 'b = <fun> 
# let nth3 (_,_,c) = c;; 
val nth3 : 'a * 'b * 'c -> 'c = <fun> 
# let nth i = match i with 
     | 1 -> nth1 
     | 2 -> nth2 
     | _ -> nth3;; 
val nth : int -> 'a * 'a * 'a -> 'a = <fun> 

तो अपने प्रश्न printf कॉल की वजह से नहीं, अजीब बात है, लेकिन इसके बजाय:

चलो इस बातचीत पर विचार करें। इसके बजाय आप एक अद्वितीय प्रकार बनाने में लग सकते हैं जो इन प्रकारों में से कुछ का संयोजन है।

दरअसल, व्यवहार प्रकार का वर्णन निर्भर प्रकार, जहां प्रकार आप वास्तव में प्राप्त इनपुट i के मूल्य पर निर्भर करता है की तरह एक छोटा सा महसूस करता है। यह स्वाभाविक रूप से समस्याग्रस्त होना चाहिए, क्योंकि निर्भर टाइपिंग एमएल में दी जाने वाली लेटेड पॉलिमॉर्फिज्म की तुलना में अधिक अभिव्यक्तिपूर्ण है!

मैं कहेंगे, आप उदाहरणों tuples के के लिए ऐसा कर सकते हैं कि, उदाहरण के लिए, आप एक प्रकार बना सकते हैं:

type IntOrStringOrX = int | string | X 

और फिर आप तदनुसार वें का एक प्रकार लिख सकते हैं ...

+0

आपकी मदद के लिए धन्यवाद। मैं निश्चित रूप से बाद में प्रकार और उदाहरणों को देखूंगा ... यह सिर्फ इतना डरावना है कि यह प्रश्न उन पर वास्तविक अध्याय से पहले आया था। – user1714986

+0

@ user1714986: दिलचस्प .. तुम मुझे किताब में प्रासंगिक उदाहरण बिंदु पर कर सकते हैं, यह इसे ठीक करने के लिए के रूप में एक विस्तृत टाइपिंग प्रणाली ocaml के उपयोग की आवश्यकता होगी नहीं है काल्पनिक है। –

+0

हाँ, पुस्तक परिचय जे हिक्की द्वारा वस्तुनिष्ठ CAML के लिए (ऑनलाइन लिंक http://courses.cms.caltech.edu/cs134/cs134b/book कहा जाता है।पीडीएफ) व्यायाम 5.3। सिद्धांत भाग अध्याय 5 के पहले दो पैराग्राफ हैं। – user1714986