2015-08-20 4 views
23

अवधारणाओं से सी ++ के लिए अवधारणाओं को हाल ही में जीसीसी ट्रंक में विलय कर दिया गया है। अवधारणाओं में से किसी को अवधारणा की शर्तों को पूरा करने के लिए प्रकारों की आवश्यकता होती है (उदाहरण के लिए तुलनात्मक ')।हास्केल टाइपक्लास के लिए सी ++ अवधारणाएं अलग-अलग कैसे हैं?

हास्केल के पास कक्षाएं हैं। मैं हास्केल से इतना परिचित नहीं हूँ। अवधारणाएं और कक्षाएं किस प्रकार संबंधित हैं?

+0

अवधारणाएं वर्तमान में अनियमित मेटाप्रोग्रामिंग सुविधाओं के लिए प्रकार प्रणाली का एक रूप है (सबकुछ एक 'टाइपनाम' है, मान मानकों को नहीं देख रहा है)। टाइप क्लास अपने तर्कों के प्रकार पर निर्भर कार्यों को ओवरलोड/चुनने की अनुमति देते हैं। https://m.reddit.com/r/haskell/comments/1e9f49/concepts_in_c_template_programming_and_type/ यह एक प्रासंगिक चर्चा हो सकती है। –

उत्तर

30

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

मुझे ध्यान रखना चाहिए कि मैं हास्केल विशेषज्ञ नहीं हूं। इससे दूर। हालांकि, मैं अवधारणाओं टीएस पर एक विशेषज्ञ हूं (मैंने इसे लिखा है, और मैंने इसे जीसीसी के लिए लागू किया है)।

  • अवधारणाएं (और बाधाएं) भविष्यवाणी करती हैं कि यह निर्धारित करता है कि कोई प्रकार एक सेट का सदस्य है या नहीं। आपको स्पष्ट रूप से घोषित करने की आवश्यकता नहीं है कि कोई प्रकार अवधारणा का मॉडल है (एक प्रकार की कक्षा का उदाहरण)। यह आवश्यकताओं के एक सेट द्वारा निर्धारित किया गया है और संकलक द्वारा चेक किया गया है। वास्तव में, अवधारणाएं आपको "T लिखने की अनुमति नहीं देती हैं C" का मॉडल है, हालांकि यह विभिन्न मेटाप्रोग्रामिंग तकनीकों का उपयोग करके आसानी से समर्थित है।

  • अवधारणाओं गैर प्रकार तर्क विवश करने के लिए इस्तेमाल किया जा सकता है, और constexpr कार्य करता है और टेम्पलेट metaprogramming की वजह से काफी किसी भी बाधा आप कभी भी लिखने के लिए आशा कर सकता है व्यक्त (जैसे, एक हैश सरणी जिसका हद तक एक प्रमुख संख्या होनी चाहिए) । मुझे विश्वास नहीं है कि यह टाइप कक्षाओं के लिए सच है।

  • अवधारणाएं प्रकार प्रणाली का हिस्सा नहीं हैं। वे घोषणाओं के उपयोग को बाधित करते हैं और कुछ मामलों में टेम्पलेट तर्क कटौती। टाइप क्लास टाइप सिस्टम का हिस्सा हैं और टाइप चेकिंग में भाग लेते हैं।

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

  • अवधारणाएं टीएस बाधाओं के क्रम के आधार पर जेनेरिक एल्गोरिदम और डेटा संरचनाओं के विशेषज्ञता का समर्थन करती है। मैं हास्केल में एक विशेषज्ञ नहीं हूं, इसलिए मुझे नहीं पता कि यहां समकक्ष है या नहीं। मुझे एक नहीं मिल रहा है।

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

मुझे लगता है कि उन प्रमुख मतभेद जब सुविधा (अवधारणाओं टीएस) की तुलना (हास्केल प्रकार वर्ग) सुविधा के लिए कर रहे हैं।

लेकिन दो भाषाओं में अंतर्निहित दार्शनिक अंतर है - और यह कार्यात्मक बनाम नहीं है जिसे आप लिख रहे हैं सी ++ का स्वाद। हास्केल मॉड्यूलर बनना चाहता है: ऐसा होने के कारण कई अच्छी संपत्तियां हैं। सी ++ टेम्पलेट्स मॉड्यूलर होने से इनकार करते हैं: इंस्टेंटेशन-टाइम लुकअप रनटाइम ओवरहेड के बिना टाइप-आधारित ऑप्टिमाइज़ेशन की अनुमति देता है। यही कारण है कि सी ++ जेनेरिक पुस्तकालय दोनों व्यापक पुन: उपयोग और अद्वितीय प्रदर्शन प्रदान करते हैं।

+0

प्रैक्टिस में, हास्केल की मॉड्यूलरिटी कुछ हद तक सीमित है क्योंकि इसका संकलन प्रदर्शन के लिए इनलाइनिंग और विशेषज्ञता पर भारी निर्भर करता है। यदि किसी मॉड्यूल को किसी भी तरह से संशोधित किया गया है, तो इसे आयात करने वाले सभी मॉड्यूल को पुन: संकलित करने की आवश्यकता होगी। विभिन्न प्रकारों से टाइप-संचालित ऑप्टिमाइज़ेशन करने के लिए तकनीकें हैं (जैसे डेटा संरचनाओं पर अनलॉकिंग लूप, जिनका आकार उनके प्रकार से तय होता है), और उपयोगकर्ता द्वारा परिभाषित कंपाइलर रीराइट नियमों के लिए कुछ हद तक जंगली प्रणाली भी है। – dfeuer

+0

क्या आपके पास सी ++ 0x अवधारणाओं और अवधारणाओं टीएस के बीच अंतरों पर अच्छा संदर्भ है? मैं इस धारणा के तहत था कि पूर्व ने मॉड्यूलर टाइप-चेकिंग हासिल की थी, तो क्या यह मानना ​​सही है कि इसे अवधारणाओं टीएस के लिए छोड़ दिया गया था? –

+0

अभी तक कोई अच्छा संदर्भ नहीं है। सी ++ 0x अवधारणाएं प्रकार कक्षाओं से बहुत अलग नहीं हैं। अवधारणाएं टीएस बाधाओं को परिभाषित करने के लिए भविष्यवाणियों का उपयोग करती है, और इसमें मॉड्यूलर प्रकार की जांच शामिल नहीं है। –

10

आप नीचे दिए गए शोध पत्र में रुचि हो सकती:

"सी ++ अवधारणाओं और हास्केल प्रकार वर्गों की तुलना", Bernardy एट अल, WGP 2008 PdfMore details।।

अपडेट: पेपर के संक्षिप्त सारांश के रूप में: पेपर सी ++ अवधारणाओं के लिए शब्दावली और हास्केल प्रकार कक्षाओं के लिए शब्दावली के बीच एक सटीक मैपिंग परिभाषित करता है और दोनों के बीच एक विस्तृत सुविधा तुलना प्रदान करने के लिए इस मानचित्रण का उपयोग करता है।

उनके निष्कर्ष का कहना है:

हमारे 27 मापदंड, टेबल 2 में संक्षेप में से 16 समान रूप से दोनों भाषाओं में समर्थन कर रहे हैं, और केवल एक या दो पोर्टेबल नहीं हैं। इसलिए, हम सुरक्षित रूप से निष्कर्ष निकाल सकते हैं जैसे हमने शुरू किया - सी ++ अवधारणाएं और हास्केल प्रकार कक्षाएं बहुत समान हैं।

जैसा कि टीसी द्वारा उल्लेख किया गया है। नीचे, यह इंगित करने लायक है कि पेपर सी ++ 0x अवधारणाओं की तुलना कर रहा है, टीएस स्वीकार नहीं करता है। मैं मतभेदों का वर्णन करने वाले एक अच्छे संदर्भ से अवगत नहीं हूं।

+2

क्या आप पेपर से विशेषज्ञ जोड़ सकते हैं? समुदाय आम तौर पर "लिंक-केवल" प्रश्नों पर फहराता है! –

+1

@ recursion.ninja अंश? – Jubobs

+7

@ जुबब्स नहीं, उसे कागज से * विशेषज्ञ * जोड़ना चाहिए। उसे लेखकों में से एक लेना चाहिए और उसे अपनी पोस्ट में डिजिटाइज करना चाहिए। हालांकि मैं स्पष्ट था;) –

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