2013-03-06 17 views
14

"प्रकार और प्रोग्रामिंग भाषाएं" पढ़ना, मैं बंद करने और रिकॉर्ड उपखंड (अध्याय 18) का उपयोग करके ऑब्जेक्ट कार्यान्वयन से प्रभावित हुआ। क्या कोई विशेष कारण है कि ओकैमल रिकॉर्ड सबटाइपिंग का समर्थन नहीं करता है (हालांकि मुझे पता है कि ऑब्जेक्ट्स करते हैं)? असल में, मुझे इसका समर्थन करने वाली कोई भी भाषा नहीं मिल रही है।OCaml रिकॉर्ड उप-समर्थन का समर्थन क्यों नहीं करता है?

+1

एसएमएल # में रिकॉर्ड सबटाइपिंग है। ओकैमल की ऑब्जेक्ट्स सबटाइपिंग के साथ रिकॉर्ड हैं। संरचनात्मक उपप्रकार शक्तिशाली है, लेकिन इसकी प्रकार की त्रुटियां अक्सर गूढ़ होती हैं। तो ओकैमल उपयोगकर्ता सामान्य रूप से सबटाइपिंग के बिना सरल रिकॉर्ड पसंद करते हैं। – camlspotter

+0

एसएमएल # को इंगित करने के लिए धन्यवाद! एसएमएल # में रिकॉर्ड सबटाइपिंग और ओकैमल में ऑब्जेक्ट स्ट्रक्चरल टाइपिंग के बीच कोई अंतर है? –

उत्तर

17

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

सभी अभिलेखों के लिए या तो संरचनात्मक उपप्रकार या पंक्ति बहुरूपता का उपयोग करने वाली प्राथमिक समस्या यह है कि इसे एक अधिक शामिल रनटाइम कार्यान्वयन की आवश्यकता होती है, और इसके परिणामस्वरूप, यह भी अधिक महंगा है। जहां साधारण रिकॉर्ड्स को सादे tuples में छोटे पैमाने पर अनुवादित किया जा सकता है, फ़ील्ड एक्सेस केवल इंडेक्सिंग के साथ, स्ट्रक्चरल सबटाइपिंग या पंक्ति पॉलीमोर्फिज्म को किसी ऑब्जेक्ट को "स्लाइस" पारदर्शी रूप से "स्लाइस" करने की क्षमता की आवश्यकता होती है, यानी यादृच्छिक फ़ील्ड को हटाए गए सुपरटेप के तहत इसे देखें। आम तौर पर, इसके लिए हैशिंग (जैसे ओकैमल्स ऑब्जेक्ट्स), या सबूत तकनीकों को पारित करने के लिए फ़ील्ड लुकअप की आवश्यकता होती है, जहां किसी फ़ंक्शन या उसके किसी भी कॉलिज़ द्वारा उपयोग किए जाने वाले प्रत्येक फ़ील्ड की अनुक्रमणिका को एक छिपी हुई तर्क के रूप में पास किया जाना चाहिए वास्तविक रिकॉर्ड (उदाहरण के लिए, एसएमएल # यही कर रहा है)।

किसी भी मामले में, ओकैम में पॉलिमॉर्फिक रिकॉर्ड हैं, उन्हें केवल ऑब्जेक्ट कहा जाता है। लेकिन अगर आपको इसकी आवश्यकता नहीं है तो आप उनके चारों ओर सभी वर्ग गड़बड़ी को अनदेखा कर सकते हैं।

+1

हां, कक्षा गड़बड़ मुझे क्या बंद कर दिया था। मैं ओकैमल के लिए नया हूं, लेकिन मैं इसके ऑब्जेक्ट सिस्टम के बारे में और जानने के लिए उत्सुक हूं। वैसे भी, आपके उत्तर के लिए धन्यवाद! –

8

रिकॉर्ड उपशीर्षक टाइपिंग बिंदु पर काफी खतरनाक है।

मान लें कि आपके पास तीन फ़ील्ड के साथ एक रिकॉर्ड है: ए, बी और सी। और आप केवल दो फ़ील्ड के साथ एक रिकॉर्ड बनाना चाहते हैं: ए और सी। संकलक यह नहीं जानता कि आप किस प्रकार का उपयोग कर रहे हैं जब तक कि वह पूरे रिकॉर्ड को पूरा नहीं कर लेता है, और अंत में, अगर आप कोई गलती करते हैं तो आपकी मदद नहीं कर सकते: उदाहरण के लिए आप बी फ़ील्ड भूल गए हैं। मैं पूरी तरह से सहमत हूं कि इस दृष्टिकोण का मुकाबला प्रतिस्पर्धात्मक है, लेकिन मुझे लगता है कि ओकंपल लिखने वाले लोग सोचते हैं।

+0

इसे इंगित करने के लिए धन्यवाद। मैं ऊपर उठूंगा, लेकिन मेरी प्रतिष्ठा बहुत कम है;) –

+1

हम्म, मुझे काफी समझ में नहीं आता है। सबटाइपिंग का मतलब है कि आप उन स्थानों पर 3-फ़ील्ड रिकॉर्ड का उपयोग कर सकते हैं जो 2-फ़ील्ड रिकॉर्ड की अपेक्षा करते हैं। लेकिन आपके उदाहरण में, आप 2-फ़ील्ड रिकॉर्ड (संभवतः गलती से) बनाते हैं। उप प्रकार के साथ भी, कंपाइलर आपको केवल उन्हीं स्थानों पर इसका उपयोग करने की अनुमति देगा जो वास्तव में 2 फ़ील्ड (या कम) की अपेक्षा करते हैं। लेकिन यह ठीक है, क्योंकि वे स्थान कभी भी आपके तीसरे क्षेत्र को नहीं देख पाएंगे। – max

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