OCaml

2009-11-17 12 views
19

में एक मौजूदा प्रकार का विस्तार मैं भाषा सीखने की और कार्यात्मक प्रोग्रामिंग के साथ और अधिक परिचित पाने के लिए हाल ही में कुछ OCaml प्रोग्रामिंग कर रहा हूँ। हाल ही में, मुझे लगता है कि है कि मैं एक मौजूदा प्रकार का विस्तार करने में सक्षम होना चाहते हैं शुरू कर दिया है (या तो या में अपने ही में से एक का निर्माण), उदाहरण के लिए:OCaml

type bexp = 
    And of bexp * bexp 
| Or of bexp * bexp 
| Xor of bexp * bexp 
| Not of bexp;; 

अब मान लीजिए कि मैं जोड़ना चाहते हैं चलो इस प्रकार के लिए एक नॉप संस्करण, लेकिन केवल नए प्रकार के उपयोग के लिए - विरासत की तरह। अरे, ये बीजगणितीय डेटा प्रकार माना जाता है, है ना? तो क्यों कुछ नहीं:

type nbexp = bexp | Nop nbexp ;; 

... लेकिन यह मान्य ओकैमल नहीं है, यह एक वाक्यविन्यास त्रुटि देता है। असल में, जो मैं करने की कोशिश कर रहा हूं वह यह कहता है कि मैं nbexp को सबकुछ शामिल करना चाहता हूं जिसमें बीएक्सपी शामिल है और इसमें एक एनओपी भी शामिल है। मुझे लगता है कि यह संभव नहीं है क्योंकि, उदाहरण के लिए यदि आपने और कन्स्ट्रक्टर का उपयोग किया है तो यह निर्धारित करने का कोई तरीका नहीं होगा कि यह एक बीएक्सपी प्रकार या nbexp प्रकार था या नहीं। (मुझे लगता है कि निर्माता Nop एक nbexp लेने भी समस्याग्रस्त हो सकता है।)

तो वहाँ OCaml में कुछ इस तरह करने के लिए कोई तरीका है? और, क्या यह ऐसी चीज है जो हास्केल में कर सकती है (टाइपक्लास के साथ, शायद)?

+1

करना होगा: https://sites.google.com/site/ocamlopen/ –

उत्तर

19

एक दिलचस्प समाधान बहुरूपी प्रकार का उपयोग करने के लिए है।

अभिव्यक्ति मूल्यांकन के एक दिलचस्प उदाहरण, विस्तार के साथ, बहुरूपी संस्करण का उपयोग कर ocaml स्रोत का एक परीक्षण निर्देशिका में पाया जा सकता, देख svn

+1

मैं इनमें से सुना है, लेकिन वास्तव में उपयोग करने के लिए चारों ओर नहीं मिला है उन्हें। यह मुझे उनके बारे में और जानने के लिए एक अच्छा व्यावहारिक कारण देता है। धन्यवाद। – aneccodeal

4

अरे, ये बीजगणित डेटा प्रकार होने चाहिए, है ना?

दाएं। और algebraic data types टैग (उर्फ भेदभाव) संघों और उत्पादों द्वारा निर्मित किए जाते हैं। क्या आप चाहते हैं सिर्फ एक (गैर टैग) संघ, जो एक बीजीय डेटा प्रकार है नहीं और हास्केल द्वारा समर्थित नहीं है है। ओकैमल में पॉलिमॉर्फिक वेरिएंट हैं (अन्य उत्तरों देखें)।

Typed Scheme गैर टैग यूनियनों का समर्थन करता है, तो आप इसे बाहर की जाँच कर सकते हैं।

4

जैसा कि आप स्वयं सही ढंग से अनुमान लगाते हैं, यह बीजगणितीय प्रकारों में संभव नहीं है। मैं Apocalisp के सुझाव से सहमत हूं कि आप अपने स्वयं के एक निर्माता में nbexp के "विरासत" भाग को आसानी से लपेट सकते हैं।

मैं जोड़ता हूं कि बीजगणित प्रकारों की विरासत की कमी उनकी अद्भुतता का हिस्सा है। इसका मतलब है कि एक अभिव्यक्ति जैसे And(foo, bar) umambiguously टाइप किया जाता है, और कास्टिंग (या तो ऊपर या नीचे) प्रकार प्रणाली में कोई भूमिका नहीं है। इससे अधिक सुरक्षा और अधिक स्पष्टता मिलती है। यह प्रोग्रामर कि/वह स्पष्ट रूप से ऐसे मामलों में जहां s/वह nbexp की bexp भागों के साथ बातचीत करना चाहता है संभाल की आवश्यकता होती है निश्चित रूप से करता है, लेकिन अगर आप इसके बारे में सोचते हैं, कि कैसे वृद्धि हुई सुरक्षा और स्पष्टता व्यवहार में महसूस किया जाता है।

type bexp = 
[ `And of bexp * bexp 
| `Or of bexp * bexp 
| `Xor of bexp * bexp 
| `Not of bexp ];; 

type nbexp = [ bexp | `Nop of nbexp ];; 

ध्यान दें कि बहुरूपी वेरिएंट सामान्य लोगों की तुलना में जटिल काम है, लेकिन प्रकार का एक्सटेंशन अनुमति देते हैं:

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