इंटरसेक्शन टाइप: Difference between revisions
No edit summary |
No edit summary |
||
(12 intermediate revisions by 5 users not shown) | |||
Line 1: | Line 1: | ||
{{short description|Concept in type theory}} | {{short description|Concept in type theory}} | ||
{{Type systems}} | {{Type systems}} | ||
[[प्रकार सिद्धांत]] में, एक | [[प्रकार सिद्धांत]] में, एक '''इंटरसेक्शन टाइप''' को उन मानों के लिए आवंटित किया जा सकता है जिन्हें प्रकार <math>\sigma</math> और प्रकार <math>\tau</math> दोनों को सौंपा जा सकता है। इस मान को प्रतिच्छेदन-प्रकार प्रणाली में इंटरसेक्शन टाइप <math>\sigma \cap \tau</math> दिया जा सकता है।<ref name=BCD83>{{cite journal |doi=10.2307/2273659 |jstor=2273659 |title=एक फ़िल्टर लैम्ब्डा मॉडल और प्रकार असाइनमेंट की पूर्णता|journal=Journal of Symbolic Logic |volume=48 |issue=4 |pages=931–940 |year=1983 |last1=Barendregt |first1=Henk |last2=Coppo |first2=Mario |last3=Dezani-Ciancaglini |first3=Mariangiola|s2cid=45660117 |author3-link= Mariangiola Dezani-Ciancaglini }}</ref> सामान्यतः, यदि दो प्रकार के मानों की श्रेणियां ओवरलैप होती हैं, तो दो श्रेणियों के प्रतिच्छेदन से संबंधित मान को इन दो प्रकारों के इंटरसेक्शन टाइप को सौंपा जा सकता है। इस तरह के मान को दोनों प्रकारों में से किसी की अपेक्षा वाले कार्यों के लिए तर्क के रूप में सुरक्षित रूप से पारित किया जा सकता है। उदाहरण के लिए, जावा में, क्लास {{code|Boolean}}{{code|Serializable}} और {{code|Comparable}} दोनों इंटरफेस लागू करता है। इसलिए, {{code|Boolean}}प्रकार की ऑब्जेक्ट को {{code|Serializable}}प्रकार के तर्क की अपेक्षा करने वाले कार्यों के लिए और {{code|Comparable}}प्रकार के तर्क की अपेक्षा करने वाले कार्यों के लिए सुरक्षित रूप से पारित किया जा सकता है। | ||
प्रतिच्छेदन [[समग्र डेटा प्रकार]] प्रकार हैं। उत्पाद प्रकारों के समान, इनका उपयोग किसी ऑब्जेक्ट को कई प्रकार निर्दिष्ट करने के लिए किया जाता है। हालाँकि, उत्पाद प्रकार टुपल्स को सौंपे जाते हैं, ताकि प्रत्येक टुपल तत्व को | प्रतिच्छेदन [[समग्र डेटा प्रकार]] प्रकार हैं। उत्पाद प्रकारों के समान, इनका उपयोग किसी ऑब्जेक्ट को कई प्रकार निर्दिष्ट करने के लिए किया जाता है। हालाँकि, उत्पाद प्रकार टुपल्स को सौंपे जाते हैं, ताकि प्रत्येक टुपल तत्व को विशेष उत्पाद प्रकार घटक सौंपा जा सके। इसकी तुलना में, इंटरसेक्शन टाइप की अंतर्निहित वस्तुएं जरूरी नहीं कि समग्र हों। इंटरसेक्शन टाइपों का प्रतिबंधित रूप परिशोधन प्रकार है। | ||
अतिभारित कार्यों का वर्णन करने के लिए | अतिभारित कार्यों का वर्णन करने के लिए इंटरसेक्शन टाइप उपयोगी होते हैं।<ref>{{cite book |doi=10.1007/978-3-642-29485-3_13 |chapter=Overloading is NP-Complete |title=तर्क और कार्यक्रम शब्दार्थ|volume=7230 |pages=204–218 |series=Lecture Notes in Computer Science |year=2012 |last1=Palsberg |first1=Jens |isbn=978-3-642-29484-6 }}</ref> उदाहरण के लिए, यदि {{TS-lang|1=number => number}}फ़ंक्शन का प्रकार है जो किसी संख्या को तर्क के रूप में लेता है और संख्या लौटाता है, और {{TS-lang|1=string => string}}फ़ंक्शन का प्रकार है जो स्ट्रिंग को तर्क के रूप में लेता है और स्ट्रिंग लौटाता है, तो इनका प्रतिच्छेदन होता है दो प्रकारों का उपयोग उन (अतिभारित) कार्यों का वर्णन करने के लिए किया जा सकता है जो या दूसरे कार्य करते हैं, यह इस पर डिपेंडेंट करता है कि उन्हें किस प्रकार का इनपुट दिया गया है। | ||
[[सीलोन (प्रोग्रामिंग भाषा)|सीलोन]], फ्लो, [[जावा (प्रोग्रामिंग भाषा)|जावा]], [[स्काला (प्रोग्रामिंग भाषा)|स्काला]], टाइपस्क्रिप्ट और वाइली ( | [[सीलोन (प्रोग्रामिंग भाषा)|सीलोन]], फ्लो, [[जावा (प्रोग्रामिंग भाषा)|जावा]], [[स्काला (प्रोग्रामिंग भाषा)|स्काला]], टाइपस्क्रिप्ट और वाइली (इंटरसेक्शन टाइपों के साथ भाषाओं की तुलना देखें) सहित समकालीन प्रोग्रामिंग भाषाएं, इंटरफ़ेस विशिष्टताओं को संयोजित करने और तदर्थ बहुरूपता को व्यक्त करने के लिए इंटरसेक्शन टाइपों का उपयोग करती हैं। पैरामीट्रिक बहुरूपता को लागू करते हुए, क्रॉस-कटिंग चिंताओं से क्लास पदानुक्रम प्रदूषण से बचने और [[बॉयलरप्लेट कोड]] को कम करने के लिए इंटरसेक्शन टाइपों का उपयोग किया जा सकता है, जैसा कि नीचे टाइपस्क्रिप्ट उदाहरण में दिखाया गया है। | ||
इंटरसेक्शन टाइपों के सैद्धांतिक अध्ययन को इंटरसेक्शन टाइप अनुशासन के रूप में जाना जाता है।<ref>{{cite book|author1=Henk Barendregt|author2=Wil Dekkers|author3=Richard Statman|title=लैम्ब्डा कैलकुलस प्रकार के साथ|url=https://books.google.com/books?id=2UVasvrhXl8C&pg=PR1|date=20 June 2013|publisher=Cambridge University Press|isbn=978-0-521-76614-2|pages=1–}}</ref> उल्लेखनीय रूप से, कार्यक्रम समाप्ति को इंटरसेक्शन टाइपों का उपयोग करके सटीक रूप से चित्रित किया जा सकता है।<ref name=G96>{{cite journal |doi=10.1305/ndjfl/1040067315 |title=प्रतिच्छेदन प्रकारों के साथ मजबूत सामान्यीकरण और टाइपेबिलिटी|journal=Notre Dame Journal of Formal Logic |volume=37 |issue=1 |pages=44–52 |year=1996 |last1=Ghilezan |first1=Silvia |doi-access=free }}</ref> | |||
== [[ टाइपप्रति ]] उदाहरण == | == [[ टाइपप्रति |टाइपस्क्रिप्ट]] उदाहरण == | ||
टाइपस्क्रिप्ट | टाइपस्क्रिप्ट इंटरसेक्शन टाइपों का समर्थन करता है,<ref name=TS/> प्रकार प्रणाली की अभिव्यक्ति में सुधार करता है और संभावित क्लास पदानुक्रम आकार को कम करता है, जो निम्नानुसार प्रदर्शित होता है। | ||
निम्नलिखित प्रोग्राम कोड | निम्नलिखित प्रोग्राम कोड {{TS-lang|Chicken}}, {{TS-lang|Cow}} और {{TS-lang|RandomNumberGenerator}}वर्गों को परिभाषित करता है, जिनमें से प्रत्येक के पास {{TS-lang|Egg}}, {{TS-lang|Milk}}या {{TS-lang|number}} में से किसी प्रकार की ऑब्जेक्ट को वापस करने का एक तरीका है। इसके अतिरिक्त, {{TS-lang|eatEgg}} और {{TS-lang|drinkMilk}}फ़ंक्शन के लिए क्रमशः {{TS-lang|Egg}}और {{TS-lang|Milk}} प्रकार के तर्कों की आवश्यकता होती है। | ||
इसके अतिरिक्त, | |||
<syntaxhighlight lang="typescript"> | <syntaxhighlight lang="typescript"> | ||
Line 39: | Line 38: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
निम्नलिखित प्रोग्राम कोड तदर्थ | निम्नलिखित प्रोग्राम कोड तदर्थ बहुरूपी फ़ंक्शन {{TS-lang|animalToFood}} को परिभाषित करता है जो दिए गए ऑब्जेक्ट {{TS-lang|animal}} के सदस्य फ़ंक्शन {{TS-lang|produce}}को आमंत्रित करता है। {{TS-lang|animalToFood}}फ़ंक्शन में दो प्रकार के एनोटेशन हैं, अर्थात् {{TS-lang|1=((_: Chicken) => Egg)}}और {{TS-lang|1=((_: Cow) => Milk)}}, जो इंटरसेक्शन टाइप कंस्ट्रक्टर & के माध्यम से जुड़ा हुआ है। विशेष रूप से, {{TS-lang|animalToFood}}जब {{TS-lang|Chicken}} प्रकार के तर्क पर लागू किया जाता है तो {{TS-lang|Egg}} प्रकार का एक ऑब्जेक्ट लौटाता है, और जब {{TS-lang|Cow}}प्रकार के तर्क पर लागू किया जाता है तो {{TS-lang|Milk}}प्रकार का ऑब्जेक्ट लौटाता है। आदर्श रूप से,{{TS-lang|animalToFood}} किसी भी ऐसी ऑब्जेक्ट पर लागू नहीं होना चाहिए जिसमें (संभवतः संयोगवश) {{TS-lang|produce}}विधि हो। | ||
आदर्श रूप से, {{TS-lang|animalToFood}} किसी भी | |||
<syntaxhighlight lang="typescript"> | <syntaxhighlight lang="typescript"> | ||
//given a chicken, produces an egg; given a cow, produces milk | //given a chicken, produces an egg; given a cow, produces milk | ||
Line 50: | Line 47: | ||
}; | }; | ||
</syntaxhighlight> | </syntaxhighlight> | ||
अंत में, निम्नलिखित प्रोग्राम कोड उपरोक्त परिभाषाओं के | अंत में, निम्नलिखित प्रोग्राम कोड उपरोक्त परिभाषाओं के सुरक्षित उपयोग को दर्शाता है। | ||
<syntaxhighlight lang="typescript" line> | |||
var chicken = new Chicken(); | var chicken = new Chicken(); | ||
var cow = new Cow(); | var cow = new Cow(); | ||
Line 70: | Line 67: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
उपरोक्त प्रोग्राम कोड में निम्नलिखित गुण हैं: | उपरोक्त प्रोग्राम कोड में निम्नलिखित गुण हैं: | ||
* | * लाइन्स 1-3 वस्तुएँ बनाती हैं {{TS-lang|chicken}}, {{TS-lang|cow}}, और {{TS-lang|randomNumberGenerator}} अपने-अपने प्रकार के है। | ||
* | * लाइन्स 5-7 पहले से बनाई गई वस्तुओं के लिए संबंधित परिणामों को प्रिंट करती हैं (टिप्पणियों के रूप में प्रदान की जाती हैं) जब {{TS-lang|produce}}अभिमंत्रित किया जाता है। | ||
* | *लाइन 9 (क्रमशः 10) {{TS-lang|chicken}} (क्रमशः {{TS-lang|cow}}) पर लागू {{TS-lang|animalToFood}} विधि के प्रकार के सुरक्षित उपयोग को प्रदर्शित करती है। | ||
* | * लाइन 11, यदि टिप्पणी नहीं की गई, तो संकलन के समय एक प्रकार की त्रुटि उत्पन्न होगी। हालाँकि, {{TS-lang|animalToFood}} का कार्यान्वयन {{TS-lang|randomNumberGenerator}}की {{TS-lang|produce}} विधि को लागू कर सकता है, {{TS-lang|animalToFood}}का प्रकार एनोटेशन इसकी अनुमति नहीं देता है। यह {{TS-lang|animalToFood}}के अभीष्ट अर्थ के अनुरूप है। | ||
* | *लाइन 13 (क्रमशः 15) दर्शाती है कि {{TS-lang|chicken}} (क्रमशः {{TS-lang|cow}}) पर {{TS-lang|animalToFood}} लगाने से {{TS-lang|Egg}} (क्रमशः {{TS-lang|Milk}}) जैसी ऑब्जेक्ट प्राप्त होती है। | ||
* | *लाइन 14 (क्रमशः 16) दर्शाती है कि {{TS-lang|cow}}(क्रमशः{{TS-lang|chicken}}) को {{TS-lang|animalToFood}} लगाने से {{TS-lang|Egg}}(क्रमशः{{TS-lang|Milk}}) जैसी ऑब्जेक्ट नहीं मिलती है। इसलिए, अगर टिप्पणी नहीं की गई, तो पंक्ति 14 (क्रमशः 16) के परिणामस्वरूप संकलन के समय एक प्रकार की त्रुटि होगी। | ||
=== | ===अंतर्निहित से तुलना=== | ||
उपरोक्त न्यूनतम उदाहरण को | उपरोक्त न्यूनतम उदाहरण को अंतर्निहित का उपयोग करके महसूस किया जा सकता है, उदाहरण के लिए आधार क्लास {{TS-lang|Animal}}से {{TS-lang|Chicken}}और {{TS-lang|Cow}}क्लास प्राप्त करके। हालाँकि, बड़ी सेटिंग में, यह हानिकारक हो सकता है। क्लास पदानुक्रम में नई कक्षाओं का परिचय क्रॉस-कटिंग चिंताओं के लिए आवश्यक रूप से उचित नहीं है, या शायद पूरी तरह से असंभव है, उदाहरण के लिए बाहरी लाइब्रेरी का उपयोग करते समय। कल्पना कीजिए, उपरोक्त उदाहरण को निम्नलिखित कक्षाओं के साथ बढ़ाया जा सकता है: | ||
हालाँकि, बड़ी सेटिंग में, यह | * क्लास {{TS-lang|Horse}} जिसमें कोई {{TS-lang|produce}}विधि नहीं है। | ||
* क्लास {{TS-lang|Sheep}} जिसमें एक{{TS-lang|produce}} विधि और रिटर्निंग{{TS-lang|Wool}}है। | |||
कल्पना कीजिए, उपरोक्त उदाहरण को निम्नलिखित | * क्लास {{TS-lang|Pig}} जिसमें एक है {{TS-lang|produce}} विधि, जिसका उपयोग केवल एक बार किया जा सकता है, {{TS-lang|Meat}}रिटर्निंग के लिए है। | ||
* | इसके लिए अतिरिक्त कक्षाओं (या इंटरफेस) की आवश्यकता हो सकती है जो यह निर्दिष्ट करती है कि क्या उपज विधि उपलब्ध है, क्या उपज विधि भोजन लौटाती है, और क्या उपज विधि का बार-बार उपयोग किया जा सकता है। कुल मिलाकर, इससे वर्ग पदानुक्रम प्रदूषित हो सकता है। | ||
* | |||
* | |||
इसके लिए अतिरिक्त कक्षाओं (या इंटरफेस) की आवश्यकता हो सकती है जो निर्दिष्ट करती है कि क्या | |||
कुल मिलाकर, | |||
=== | === डक टाइपिंग से तुलना === | ||
उपरोक्त न्यूनतम उदाहरण पहले से ही दिखाता है कि दिए गए परिदृश्य को समझने के लिए | उपरोक्त न्यूनतम उदाहरण पहले से ही दिखाता है कि डक टाइपिंग दिए गए परिदृश्य को समझने के लिए कम उपयुक्त है। जबकि क्लास {{TS-lang|RandomNumberGenerator}} में {{TS-lang|produce}} विधि सम्मिलित है, ऑब्जेक्ट {{TS-lang|RandomNumberGenerator}} को{{TS-lang|animalToFood}}के लिए एक वैध तर्क नहीं होना चाहिए। उपरोक्त उदाहरण को डक टाइपिंग का उपयोग करके महसूस किया जा सकता है, उदाहरण के लिए {{TS-lang|Chicken}} और {{TS-lang|Cow}}वर्गों के लिए नया फ़ील्ड {{TS-lang|argumentForAnimalToFood}}पेश करके यह दर्शाया गया है कि संबंधित प्रकार की वस्तुएं {{TS-lang|animalToFood}}के लिए वैध तर्क हैं। हालाँकि, इससे न केवल संबंधित वर्गों का आकार बढ़ेगा (विशेष रूप से {{TS-lang|animalToFood}}के समान अधिक तरीकों की प्रारम्भ के साथ), बल्कि {{TS-lang|animalToFood}}के संबंध में गैर-स्थानीय दृष्टिकोण भी है। | ||
जबकि | |||
उपरोक्त उदाहरण को डक टाइपिंग का उपयोग करके महसूस किया जा सकता है, उदाहरण के लिए | |||
हालाँकि, इससे न केवल संबंधित वर्गों का आकार बढ़ेगा (विशेष रूप से समान तरीकों की | |||
=== [[फ़ंक्शन ओवरलोडिंग]] से तुलना === | === [[फ़ंक्शन ओवरलोडिंग]] से तुलना === | ||
उपरोक्त उदाहरण को फ़ंक्शन ओवरलोडिंग का उपयोग करके महसूस किया जा सकता है, उदाहरण के लिए दो तरीकों को लागू करके {{TS-lang|animalToFood(animal: Chicken): Egg}} और {{TS-lang|animalToFood(animal: Cow): Milk}}. | उपरोक्त उदाहरण को फ़ंक्शन ओवरलोडिंग का उपयोग करके महसूस किया जा सकता है, उदाहरण के लिए दो तरीकों को लागू करके {{TS-lang|animalToFood(animal: Chicken): Egg}} और {{TS-lang|animalToFood(animal: Cow): Milk}}.टाइपस्क्रिप्ट में, ऐसा समाधान दिए गए उदाहरण के लगभग समान है।अन्य प्रोग्रामिंग भाषाओं, जैसे Java_(प्रोग्रामिंग_भाषा) को अतिभारित पद्धति के विशिष्ट कार्यान्वयन की आवश्यकता होती है। इससे या तो [[कोड दोहराव]] या बॉयलरप्लेट कोड हो सकता है। | ||
टाइपस्क्रिप्ट में, ऐसा समाधान दिए गए उदाहरण के लगभग समान | |||
इससे या तो [[कोड दोहराव]] या बॉयलरप्लेट कोड हो सकता है। | |||
=== | === विज़िटर पैटर्न की तुलना === | ||
उपरोक्त उदाहरण को विज़िटर पैटर्न का उपयोग करके महसूस किया जा सकता है। | उपरोक्त उदाहरण को विज़िटर पैटर्न का उपयोग करके महसूस किया जा सकता है। इसे लागू करने के लिए प्रत्येक पशु क्लास की आवश्यकता होगी {{TS-lang|accept}} इंटरफ़ेस को कार्यान्वित करने वाली किसी ऑब्जेक्ट को स्वीकार करने की विधि {{TS-lang|AnimalVisitor}} (गैर-स्थानीय बॉयलरप्लेट कोड जोड़ना)। कार्यक्रम {{TS-lang|animalToFood}} के रूप में साकार किया जाएगा {{TS-lang|visit}} के कार्यान्वयन की विधि {{TS-lang|AnimalVisitor}}.दुर्भाग्य से, इनपुट प्रकार के बीच संबंध ({{TS-lang|Chicken}} या {{TS-lang|Cow}}) और परिणाम प्रकार ({{TS-lang|Egg}} या {{TS-lang|Milk}}) का प्रतिनिधित्व करना कठिन होगा। | ||
इसे लागू करने के लिए प्रत्येक पशु | |||
कार्यक्रम {{TS-lang|animalToFood}} के रूप में साकार किया जाएगा {{TS-lang|visit}} के कार्यान्वयन की विधि {{TS-lang|AnimalVisitor}}. | |||
दुर्भाग्य से, इनपुट प्रकार के बीच संबंध ({{TS-lang|Chicken}} या {{TS-lang|Cow}}) और परिणाम प्रकार ({{TS-lang|Egg}} या {{TS-lang|Milk}}) का प्रतिनिधित्व करना कठिन होगा। | |||
=== सीमाएँ === | === सीमाएँ === | ||
एक ओर, वर्ग पदानुक्रम में | एक ओर, वर्ग पदानुक्रम में नए वर्गों (या इंटरफेस) को पेश किए बिना किसी फ़ंक्शन में विभिन्न प्रकारों को स्थानीय रूप से एनोटेट करने के लिए चौराहे प्रकारों का उपयोग किया जा सकता है। दूसरी ओर, इस दृष्टिकोण के लिए सभी संभावित तर्क प्रकारों और परिणाम प्रकारों को स्पष्ट रूप से निर्दिष्ट करना आवश्यक है। यदि किसी फ़ंक्शन के व्यवहार को एकीकृत इंटरफ़ेस, पैरामीट्रिक बहुरूपता, या डक टाइपिंग द्वारा सटीक रूप से निर्दिष्ट किया जा सकता है, तो इंटरसेक्शन टाइपों की क्रिया प्रकृति प्रतिकूल है। इसलिए, इंटरसेक्शन टाइपों को उपस्थित विशिष्टीकरण विधियों का पूरक माना जाना चाहिए। | ||
दूसरी ओर, इस दृष्टिकोण के लिए सभी संभावित तर्क प्रकारों और परिणाम प्रकारों को स्पष्ट रूप से निर्दिष्ट | |||
यदि किसी फ़ंक्शन के व्यवहार को एकीकृत इंटरफ़ेस, पैरामीट्रिक बहुरूपता, या डक टाइपिंग द्वारा सटीक रूप से निर्दिष्ट किया जा सकता है, तो | |||
इसलिए, | |||
== | == डिपेंडेंट इंटरसेक्शन टाइप == | ||
डिपेंडेंट इंटरसेक्शन टाइप, जिसे <math>(x : \sigma) \cap \tau</math> दर्शाया गया है, डिपेंडेंट प्रकार है जिसमें प्रकार <math>\tau</math> शब्द चर <math>x</math> पर डिपेंडेंट हो सकता है।<ref name=K03>{{cite conference |title=Dependent intersection: A new way of defining records in type theory |last1=Kopylov |first1=Alexei |year=2003 |publisher=IEEE Computer Society |book-title=18th IEEE Symposium on Logic in Computer Science |pages=86–95 |conference=LICS 2003 |doi=10.1109/LICS.2003.1210048 |citeseerx=10.1.1.89.4223 }}</ref> विशेष रूप से, यदि किसी पद <math>M</math> में डिपेंडेंट इंटरसेक्शन टाइप <math>(x : \sigma) \cap \tau</math> है, तो पद <math>M</math> में प्रकार <math>\sigma</math> और प्रकार <math>\tau[x := M]</math>दोनों हैं, जहां <math>\tau[x := M]</math>है वह प्रकार जो शब्द वेरिएबल <math>x</math> की सभी घटनाओं को <math>\tau</math> में शब्द <math>M</math> द्वारा प्रतिस्थापित करने के परिणामस्वरूप प्राप्त होता है। | |||
विशेष रूप से, यदि | |||
=== स्काला उदाहरण === | === स्काला उदाहरण === | ||
स्काला (प्रोग्रामिंग भाषा) प्रकार की घोषणाओं का समर्थन करती है <ref>{{cite web |url=https://www.scala-lang.org/files/archive/spec/2.12/04-basic-declarations-and-definitions.html#type-declarations-and-type-aliases |title=स्कैला में घोषणाएँ टाइप करें|access-date=2019-08-15}}</ref> | स्काला (प्रोग्रामिंग भाषा) प्रकार की घोषणाओं का समर्थन करती है <ref>{{cite web |url=https://www.scala-lang.org/files/archive/spec/2.12/04-basic-declarations-and-definitions.html#type-declarations-and-type-aliases |title=स्कैला में घोषणाएँ टाइप करें|access-date=2019-08-15}}</ref> ऑब्जेक्ट सदस्यों के रूप में। यह किसी ऑब्जेक्ट सदस्य के प्रकार को किसी अन्य सदस्य के मान पर डिपेंडेंट करने की अनुमति देता है, जिसे पथ-डिपेंडेंट प्रकार कहा जाता है।<ref> | ||
{{cite journal |last1=Amin |first1=Nada |last2=Grütter |first2=Samuel |last3=Odersky |first3=Martin |last4=Rompf |first4=Tiark |last5=Stucki |first5=Sandro |title=The essence of dependent object types |series=A List of Successes That Can Change the World - Essays Dedicated to Philip Wadler on the Occasion of His 60th Birthday |journal=Lecture Notes in Computer Science |volume=9600 |pages=249–272 |year=2016 |publisher=Springer |doi=10.1007/978-3-319-30936-1_14 |isbn=978-3-319-30935-4 |url=https://infoscience.epfl.ch/record/215280/files/paper_1.pdf }}</ref> | {{cite journal |last1=Amin |first1=Nada |last2=Grütter |first2=Samuel |last3=Odersky |first3=Martin |last4=Rompf |first4=Tiark |last5=Stucki |first5=Sandro |title=The essence of dependent object types |series=A List of Successes That Can Change the World - Essays Dedicated to Philip Wadler on the Occasion of His 60th Birthday |journal=Lecture Notes in Computer Science |volume=9600 |pages=249–272 |year=2016 |publisher=Springer |doi=10.1007/978-3-319-30936-1_14 |isbn=978-3-319-30935-4 |url=https://infoscience.epfl.ch/record/215280/files/paper_1.pdf }}</ref> उदाहरण के लिए, निम्नलिखित प्रोग्राम टेक्स्ट स्काला विशेषता को परिभाषित करता है <syntaxhighlight lang="Scala" inline>Witness</syntaxhighlight>, जिसका उपयोग [[सिंगलटन पैटर्न]] को लागू करने के लिए किया जा सकता है।<ref>{{cite web |url=https://github.com/milessabin/shapeless/blob/master/core/src/main/scala/shapeless/singletons.scala |title=स्काला आकारहीन पुस्तकालय में सिंगलटन|website=[[GitHub]] |access-date=2019-08-15}}</ref> | ||
उदाहरण के लिए, निम्नलिखित प्रोग्राम टेक्स्ट स्काला विशेषता को परिभाषित करता है <syntaxhighlight lang="Scala" inline>Witness</syntaxhighlight>, जिसका उपयोग [[सिंगलटन पैटर्न]] को लागू करने के लिए किया जा सकता है।<ref>{{cite web |url=https://github.com/milessabin/shapeless/blob/master/core/src/main/scala/shapeless/singletons.scala |title=स्काला आकारहीन पुस्तकालय में सिंगलटन|website=[[GitHub]] |access-date=2019-08-15}}</ref> | |||
<syntaxhighlight lang="Scala"> | <syntaxhighlight lang="Scala"> | ||
trait Witness { | trait Witness { | ||
Line 126: | Line 105: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
उपरोक्त विशेषता <syntaxhighlight lang="Scala" inline>Witness</syntaxhighlight> सदस्य | उपरोक्त विशेषता <syntaxhighlight lang="Scala" inline>Witness</syntaxhighlight>सदस्य <syntaxhighlight lang="Scala" inline>T</syntaxhighlight> को घोषित करता है, जिसे इसके <syntaxhighlight lang="Scala" inline>value</syntaxhighlight>के रूप में एक प्रकार सौंपा जा सकता है, और सदस्य मान, जिसे प्रकार <syntaxhighlight lang="Scala" inline>T</syntaxhighlight> का मान सौंपा जा सकता है। निम्नलिखित प्रोग्राम पाठ उपरोक्त विशेषता <syntaxhighlight lang="Scala" inline="">Witness </syntaxhighlight>के उदाहरण के रूप में एक ऑब्जेक्ट <syntaxhighlight lang="Scala" inline>booleanWitness</syntaxhighlight>को परिभाषित करता है। ऑब्जेक्ट <syntaxhighlight lang="Scala" inline>booleanWitness</syntaxhighlight> प्रकार <syntaxhighlight lang="Scala" inline>T</syntaxhighlight> को <syntaxhighlight lang="Scala" inline>Boolean</syntaxhighlight>और <syntaxhighlight lang="Scala" inline>value</syntaxhighlight>को <syntaxhighlight lang="Scala" inline>true</syntaxhighlight> के रूप में परिभाषित करता है। उदाहरण के लिए<syntaxhighlight lang="Scala" inline>System.out.println(booleanWitness.value)</syntaxhighlight>, को निष्पादित करने से कंसोल पर <syntaxhighlight lang="Scala" inline>true</syntaxhighlight> प्रिंट होता है। | ||
निम्नलिखित प्रोग्राम | |||
उदाहरण के लिए | |||
<syntaxhighlight lang="Scala"> | <syntaxhighlight lang="Scala"> | ||
object booleanWitness extends Witness { | object booleanWitness extends Witness { | ||
Line 136: | Line 112: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
मान लीजिये <math>\langle \textsf{x} : \sigma \rangle</math> सदस्य वाली वस्तुओं का प्रकार (विशेष रूप से, [[रिकॉर्ड (कंप्यूटर विज्ञान)]]) हो <math>\textsf{x}</math> प्रकार का <math>\sigma</math>. | |||
उपरोक्त उदाहरण में, object <syntaxhighlight lang="Scala" inline>booleanWitness</syntaxhighlight> | उपरोक्त उदाहरण में, object <syntaxhighlight lang="Scala" inline>booleanWitness</syntaxhighlight> डिपेंडेंट इंटरसेक्शन टाइप निर्दिष्ट किया जा सकता है <math>(x : \langle \textsf{T} : \text{Type} \rangle) \cap \langle \textsf{value} : x.\textsf{T} \rangle</math>. तर्क इस प्रकार है. जो ऑब्जेक्ट <syntaxhighlight lang="Scala" inline>booleanWitness</syntaxhighlight> सदस्य है <syntaxhighlight lang="Scala" inline>T</syntaxhighlight> वह प्रकार असाइन किया गया है <syntaxhighlight lang="Scala" inline>Boolean</syntaxhighlight> इसके मूल्य के रूप में. | ||
तर्क इस प्रकार है. जो | तब से <syntaxhighlight lang="Scala" inline>Boolean</syntaxhighlight> एक प्रकार है, ऑब्जेक्ट है <syntaxhighlight lang="Scala" inline>booleanWitness</syntaxhighlight> प्रकार है <math>\langle \textsf{T} : \text{Type} \rangle</math>. इसके अतिरिक्त, ऑब्जेक्ट <syntaxhighlight lang="Scala" inline>booleanWitness</syntaxhighlight> सदस्य है <syntaxhighlight lang="Scala" inline>value</syntaxhighlight> वह मान असाइन किया गया है <syntaxhighlight lang="Scala" inline>true</syntaxhighlight> प्रकार का <syntaxhighlight lang="Scala" inline>Boolean</syntaxhighlight>.के मूल्य के बाद से <syntaxhighlight lang="Scala" inline>booleanWitness.T</syntaxhighlight> है <syntaxhighlight lang="Scala" inline>Boolean</syntaxhighlight>, जो ऑब्जेक्ट <syntaxhighlight lang="Scala" inline>booleanWitness</syntaxhighlight> <math>\langle \textsf{value} : \textsf{booleanWitness.T} \rangle</math>प्रकार है। कुल मिलाकर, ऑब्जेक्ट <syntaxhighlight lang="Scala" inline>booleanWitness</syntaxhighlight> <math>\langle \textsf{T} : \text{Type} \rangle \cap \langle \textsf{value} : \textsf{booleanWitness.T} \rangle</math>इंटरसेक्शन टाइप है अत: स्व-संदर्भ को निर्भरता, ऑब्जेक्ट के रूप में प्रस्तुत करना <syntaxhighlight lang="Scala" inline>booleanWitness</syntaxhighlight> डिपेंडेंट इंटरसेक्शन टाइप<math>(x : \langle \textsf{T} : \text{Type} \rangle) \cap \langle \textsf{value} : x.\textsf{T} \rangle</math> है। | ||
तब से <syntaxhighlight lang="Scala" inline>Boolean</syntaxhighlight> एक प्रकार है, | |||
इसके अतिरिक्त, | |||
के मूल्य के बाद से <syntaxhighlight lang="Scala" inline>booleanWitness.T</syntaxhighlight> है <syntaxhighlight lang="Scala" inline>Boolean</syntaxhighlight>, जो | |||
कुल मिलाकर, | |||
अत: स्व-संदर्भ को निर्भरता, | |||
== | वैकल्पिक रूप से, उपरोक्त न्यूनतम उदाहरण को डिपेंडेंट रिकॉर्ड प्रकारों का उपयोग करके वर्णित किया जा सकता है।<ref>{{cite conference |title=गणितीय संरचना का प्रतिनिधित्व करने के लिए निर्भरता से टाइप किए गए रिकॉर्ड|last1=Pollack |first1=Robert |publisher=Springer |book-title=Theorem Proving in Higher Order Logics, 13th International Conference |pages=462–479 |conference=TPHOLs 2000 |year=2000 |doi=10.1007/3-540-44659-1_29 }}</ref> डिपेंडेंट इंटरसेक्शन टाइपों की तुलना में, डिपेंडेंट रिकॉर्ड प्रकार अधिक विशिष्ट प्रकार की सैद्धांतिक अवधारणा का गठन करते हैं।<ref name=K03/> | ||
== प्रकार के वर्ग का प्रतिच्छेदन == | |||
प्रकार के परिवार का प्रतिच्छेदन, जिसे <math display="inline">\bigcap_{x : \sigma} \tau</math> दर्शाया जाता है, डिपेंडेंट प्रकार है जिसमें प्रकार <math>\tau</math> शब्द चर <math>x</math> पर निर्भर हो सकता है। विशेष रूप से, यदि किसी पद <math>M</math> का प्रकार <math display="inline">\bigcap_{x : \sigma} \tau</math> है, तो <math>\sigma</math> प्रकार के प्रत्येक पद <math>N</math> के लिए, पद <math>M</math> का प्रकार <math>\tau[x := N]</math>है।<ref>{{cite journal |last1=Stump |first1=Aaron |year=2018 |title=बोधगम्यता से आश्रित प्रतिच्छेदन के माध्यम से प्रेरण तक|journal=Annals of Pure and Applied Logic |volume=169 |issue=7 |pages=637–655 |doi=10.1016/j.apal.2018.03.002 |doi-access=free }}</ref> इस धारणा को अंतर्निहित पाई प्रकार भी कहा जाता है, [11] यह देखते हुए कि तर्क <math>N</math> को पद स्तर पर नहीं रखा गया है। | |||
== | == अन्तर्विभाजक प्रकारों वाली भाषाओं की तुलना == | ||
{| class="wikitable sortable" | {| class="wikitable sortable" | ||
|- | |- | ||
! | ! भाषा !! सक्रिय रूप से विकसित !! उदाहरण !! स्थिति !! विशेषताएँ | ||
|- | |- | ||
| [[C_Sharp_(programming_language)|C#]] || {{yes}}<ref>{{cite web |url=http://csharp.net/ |title=C# Guide |access-date=2019-08-08}}</ref> || | | [[C_Sharp_(programming_language)|C#]] || {{yes}}<ref>{{cite web |url=http://csharp.net/ |title=C# Guide |access-date=2019-08-08}}</ref> || | ||
Line 161: | Line 129: | ||
* [[imperative programming|Imperative]] | * [[imperative programming|Imperative]] | ||
* [[object-oriented programming|Object-oriented]] | * [[object-oriented programming|Object-oriented]] | ||
| {{maybe|Under discussion}}<ref>{{cite web |url=https://github.com/dotnet/csharplang/issues/399 |title=Discussion: Union and Intersection types in C Sharp |website=[[GitHub]] |access-date=2019-08-08}}</ref> || | | {{maybe|Under discussion}}<ref>{{cite web |url=https://github.com/dotnet/csharplang/issues/399 |title=Discussion: Union and Intersection types in C Sharp |website=[[GitHub]] |access-date=2019-08-08}}</ref> || इसके अतिरिक्त, सामान्य प्रकार के पैरामीटर में बाधाएं हो सकती हैं जिनके लिए कई इंटरफेस को लागू करने के लिए उनके (मोनोमोर्फाइज्ड) प्रकार-तर्कों की आवश्यकता होती है, जिसके बाद जेनेरिक प्रकार पैरामीटर द्वारा दर्शाया गया रनटाइम प्रकार सभी सूचीबद्ध इंटरफेस का एक प्रतिच्छेदन-प्रकार बन जाता है। | ||
|- | |- | ||
| [[Ceylon (programming language)|Ceylon]] || {{yes}}<ref>{{cite web|url=https://ceylon-lang.org/|title=Eclipse Ceylon: Welcom to Ceylon|access-date=2019-08-08}}</ref> || | | [[Ceylon (programming language)|Ceylon]] || {{yes}}<ref>{{cite web|url=https://ceylon-lang.org/|title=Eclipse Ceylon: Welcom to Ceylon|access-date=2019-08-08}}</ref> || | ||
* [[Object-oriented programming|Object-oriented]] | * [[Object-oriented programming|Object-oriented]] | ||
| {{yes|Supported}}<ref name=Cey>{{cite web |url=https://ceylon-lang.org/documentation/tour/types/#intersection_types |title=Intersection Types in Ceylon |access-date=2019-08-08}}</ref> || | | {{yes|Supported}}<ref name=Cey>{{cite web |url=https://ceylon-lang.org/documentation/tour/types/#intersection_types |title=Intersection Types in Ceylon |access-date=2019-08-08}}</ref> || | ||
* | * प्रकार परिशोधन | ||
* | * इंटरफ़ेस रचना | ||
* | * चौड़ाई में उपप्रकार | ||
|- | |- | ||
| [[F_Sharp_(programming_language)|F#]] || {{yes}}<ref>{{cite web |url=http://fsharp.org/ |title=F# Software Foundation |access-date=2019-08-08}}</ref> || | | [[F_Sharp_(programming_language)|F#]] || {{yes}}<ref>{{cite web |url=http://fsharp.org/ |title=F# Software Foundation |access-date=2019-08-08}}</ref> || | ||
Line 182: | Line 150: | ||
* [[scripting language|Scripting]] | * [[scripting language|Scripting]] | ||
| {{yes|Supported}}<ref>{{cite web |url=https://flow.org/en/docs/types/intersections/#intersection-type-syntax |title=Intersection Type Syntax in Flow |access-date=2019-08-08}}</ref> || | | {{yes|Supported}}<ref>{{cite web |url=https://flow.org/en/docs/types/intersections/#intersection-type-syntax |title=Intersection Type Syntax in Flow |access-date=2019-08-08}}</ref> || | ||
* | * प्रकार परिशोधन | ||
* | * इंटरफ़ेस रचना | ||
|- | |- | ||
| [[Forsythe_(programming_language)|Forsythe]] || {{no}} || | | [[Forsythe_(programming_language)|Forsythe]] || {{no}} || | ||
Line 189: | Line 157: | ||
| {{yes|Supported}}<ref>Reynolds, J. C. (1988). Preliminary design of the programming language Forsythe.</ref> | | {{yes|Supported}}<ref>Reynolds, J. C. (1988). Preliminary design of the programming language Forsythe.</ref> | ||
| | | | ||
* | * फ़ंक्शन प्रकार प्रतिच्छेदन | ||
* | * वितरणात्मक, सह- और विरोधाभासी फ़ंक्शन प्रकार उपप्रकार | ||
|- | |- | ||
| [[Java (programming language)|Java]] || {{yes}}<ref>{{cite web|url=https://www.oracle.com/java/|title=Java Software |access-date=2019-08-08}}</ref> | | [[Java (programming language)|Java]] || {{yes}}<ref>{{cite web|url=https://www.oracle.com/java/|title=Java Software |access-date=2019-08-08}}</ref> | ||
Line 197: | Line 165: | ||
* [[Object-oriented programming|Object-oriented]] | * [[Object-oriented programming|Object-oriented]] | ||
| {{yes|Supported}}<ref>{{cite web |url=https://docs.oracle.com/en/java/javase/12/docs/api/java.compiler/javax/lang/model/type/IntersectionType.html |title=IntersectionType (Java SE 12 & JDK 12) |access-date=2019-08-01}}</ref> | | {{yes|Supported}}<ref>{{cite web |url=https://docs.oracle.com/en/java/javase/12/docs/api/java.compiler/javax/lang/model/type/IntersectionType.html |title=IntersectionType (Java SE 12 & JDK 12) |access-date=2019-08-01}}</ref> | ||
| | | | ||
* | * प्रकार परिशोधन | ||
* | * इंटरफ़ेस रचना | ||
* | * चौड़ाई में उपप्रकार | ||
|- | |- | ||
|- | |- | ||
Line 210: | Line 178: | ||
* [[scripting language|Scripting]] | * [[scripting language|Scripting]] | ||
| {{yes|Supported}}<ref>{{cite web |url=https://php.watch/versions/8.1/intersection-types |title=PHP.Watch - PHP 8.1: Intersection Types}}</ref> | | {{yes|Supported}}<ref>{{cite web |url=https://php.watch/versions/8.1/intersection-types |title=PHP.Watch - PHP 8.1: Intersection Types}}</ref> | ||
| | | | ||
* | * प्रकार परिशोधन | ||
* | * इंटरफ़ेस रचना | ||
|- | |- | ||
| [[Scala (programming language)|Scala]] || {{yes}}<ref>{{cite web|url=https://scala-lang.org/|title=The Scala Programming Language|access-date=2019-08-08}}</ref> | | [[Scala (programming language)|Scala]] || {{yes}}<ref>{{cite web|url=https://scala-lang.org/|title=The Scala Programming Language|access-date=2019-08-08}}</ref> | ||
Line 220: | Line 188: | ||
* [[Object-oriented programming|Object-oriented]] | * [[Object-oriented programming|Object-oriented]] | ||
| {{yes|Supported}}<ref>{{cite web |url=https://www.scala-lang.org/files/archive/spec/2.12/03-types.html#compound-types |title=Compound Types in Scala |access-date=2019-08-01}}</ref><ref>{{cite web |url=http://dotty.epfl.ch/docs/reference/new-types/intersection-types.html |title=Intersection Types in Dotty |access-date=2019-08-01}}</ref> | | {{yes|Supported}}<ref>{{cite web |url=https://www.scala-lang.org/files/archive/spec/2.12/03-types.html#compound-types |title=Compound Types in Scala |access-date=2019-08-01}}</ref><ref>{{cite web |url=http://dotty.epfl.ch/docs/reference/new-types/intersection-types.html |title=Intersection Types in Dotty |access-date=2019-08-01}}</ref> | ||
| | | | ||
* | * प्रकार परिशोधन | ||
* | * गुण रचना | ||
* | * चौड़ाई में उपप्रकार | ||
|- | |- | ||
| [[Microsoft TypeScript|TypeScript]] || {{yes}}<ref>{{cite web |url=https://www.typescriptlang.org/ |title=TypeScript - JavaScript that scales. |access-date=2019-08-01}}</ref> || | | [[Microsoft TypeScript|TypeScript]] || {{yes}}<ref>{{cite web |url=https://www.typescriptlang.org/ |title=TypeScript - JavaScript that scales. |access-date=2019-08-01}}</ref> || | ||
Line 231: | Line 199: | ||
* [[scripting language|Scripting]] | * [[scripting language|Scripting]] | ||
| {{yes|Supported}}<ref name=TS>{{cite web |url=https://www.typescriptlang.org/docs/handbook/advanced-types.html#intersection-types |title=Intersection Types in TypeScript |access-date=2019-08-01}}</ref> || | | {{yes|Supported}}<ref name=TS>{{cite web |url=https://www.typescriptlang.org/docs/handbook/advanced-types.html#intersection-types |title=Intersection Types in TypeScript |access-date=2019-08-01}}</ref> || | ||
* | * यादृच्छिक प्रकार का प्रतिच्छेदन | ||
* | * इंटरफ़ेस रचना | ||
* | * चौड़ाई और गहराई में उपप्रकार | ||
|- | |- | ||
| [[Whiley_(programming_language)|Whiley]] || {{yes}}<ref>{{cite web |url=http://whiley.org/ |title=Whiley: an Open Source Programming Language with Extended Static Checking |access-date=2019-08-01}}</ref> || | | [[Whiley_(programming_language)|Whiley]] || {{yes}}<ref>{{cite web |url=http://whiley.org/ |title=Whiley: an Open Source Programming Language with Extended Static Checking |access-date=2019-08-01}}</ref> || | ||
Line 240: | Line 208: | ||
| {{yes|Supported}}<ref>{{cite web |url=http://whiley.org/download/WhileyLanguageSpec.pdf |title=Whiley language specification |access-date=2019-08-01}}</ref> || {{dunno}} | | {{yes|Supported}}<ref>{{cite web |url=http://whiley.org/download/WhileyLanguageSpec.pdf |title=Whiley language specification |access-date=2019-08-01}}</ref> || {{dunno}} | ||
|} | |} | ||
==संदर्भ== | ==संदर्भ== | ||
Line 247: | Line 214: | ||
{{Data types}} | {{Data types}} | ||
<!--- Categories ---> | <!--- Categories ---> | ||
[[Category: | [[Category:Collapse templates]] | ||
[[Category:Created On 08/07/2023]] | [[Category:Created On 08/07/2023]] | ||
[[Category:Lua-based templates]] | |||
[[Category:Machine Translated Page]] | |||
[[Category:Navigational boxes| ]] | |||
[[Category:Navigational boxes without horizontal lists]] | |||
[[Category:Pages with script errors]] | |||
[[Category:Short description with empty Wikidata description]] | |||
[[Category:Sidebars with styles needing conversion]] | |||
[[Category:Template documentation pages|Documentation/doc]] | |||
[[Category:Templates Vigyan Ready]] | |||
[[Category:Templates generating microformats]] | |||
[[Category:Templates that add a tracking category]] | |||
[[Category:Templates that are not mobile friendly]] | |||
[[Category:Templates that generate short descriptions]] | |||
[[Category:Templates using TemplateData]] | |||
[[Category:Wikipedia metatemplates]] | |||
[[Category:टाइपप्रति]] | |||
[[Category:डेटा के प्रकार]] | |||
[[Category:प्रकार सिद्धांत]] | |||
[[Category:बहुरूपता (कंप्यूटर विज्ञान)]] | |||
[[Category:समग्र डेटा प्रकार]] | |||
[[Category:सिस्टम टाइप करें]] |
Latest revision as of 09:37, 6 September 2023
Type systems |
---|
General concepts |
Major categories |
|
Minor categories |
प्रकार सिद्धांत में, एक इंटरसेक्शन टाइप को उन मानों के लिए आवंटित किया जा सकता है जिन्हें प्रकार और प्रकार दोनों को सौंपा जा सकता है। इस मान को प्रतिच्छेदन-प्रकार प्रणाली में इंटरसेक्शन टाइप दिया जा सकता है।[1] सामान्यतः, यदि दो प्रकार के मानों की श्रेणियां ओवरलैप होती हैं, तो दो श्रेणियों के प्रतिच्छेदन से संबंधित मान को इन दो प्रकारों के इंटरसेक्शन टाइप को सौंपा जा सकता है। इस तरह के मान को दोनों प्रकारों में से किसी की अपेक्षा वाले कार्यों के लिए तर्क के रूप में सुरक्षित रूप से पारित किया जा सकता है। उदाहरण के लिए, जावा में, क्लास Boolean
Serializable
और Comparable
दोनों इंटरफेस लागू करता है। इसलिए, Boolean
प्रकार की ऑब्जेक्ट को Serializable
प्रकार के तर्क की अपेक्षा करने वाले कार्यों के लिए और Comparable
प्रकार के तर्क की अपेक्षा करने वाले कार्यों के लिए सुरक्षित रूप से पारित किया जा सकता है।
प्रतिच्छेदन समग्र डेटा प्रकार प्रकार हैं। उत्पाद प्रकारों के समान, इनका उपयोग किसी ऑब्जेक्ट को कई प्रकार निर्दिष्ट करने के लिए किया जाता है। हालाँकि, उत्पाद प्रकार टुपल्स को सौंपे जाते हैं, ताकि प्रत्येक टुपल तत्व को विशेष उत्पाद प्रकार घटक सौंपा जा सके। इसकी तुलना में, इंटरसेक्शन टाइप की अंतर्निहित वस्तुएं जरूरी नहीं कि समग्र हों। इंटरसेक्शन टाइपों का प्रतिबंधित रूप परिशोधन प्रकार है।
अतिभारित कार्यों का वर्णन करने के लिए इंटरसेक्शन टाइप उपयोगी होते हैं।[2] उदाहरण के लिए, यदि number => number
फ़ंक्शन का प्रकार है जो किसी संख्या को तर्क के रूप में लेता है और संख्या लौटाता है, और string => string
फ़ंक्शन का प्रकार है जो स्ट्रिंग को तर्क के रूप में लेता है और स्ट्रिंग लौटाता है, तो इनका प्रतिच्छेदन होता है दो प्रकारों का उपयोग उन (अतिभारित) कार्यों का वर्णन करने के लिए किया जा सकता है जो या दूसरे कार्य करते हैं, यह इस पर डिपेंडेंट करता है कि उन्हें किस प्रकार का इनपुट दिया गया है।
सीलोन, फ्लो, जावा, स्काला, टाइपस्क्रिप्ट और वाइली (इंटरसेक्शन टाइपों के साथ भाषाओं की तुलना देखें) सहित समकालीन प्रोग्रामिंग भाषाएं, इंटरफ़ेस विशिष्टताओं को संयोजित करने और तदर्थ बहुरूपता को व्यक्त करने के लिए इंटरसेक्शन टाइपों का उपयोग करती हैं। पैरामीट्रिक बहुरूपता को लागू करते हुए, क्रॉस-कटिंग चिंताओं से क्लास पदानुक्रम प्रदूषण से बचने और बॉयलरप्लेट कोड को कम करने के लिए इंटरसेक्शन टाइपों का उपयोग किया जा सकता है, जैसा कि नीचे टाइपस्क्रिप्ट उदाहरण में दिखाया गया है।
इंटरसेक्शन टाइपों के सैद्धांतिक अध्ययन को इंटरसेक्शन टाइप अनुशासन के रूप में जाना जाता है।[3] उल्लेखनीय रूप से, कार्यक्रम समाप्ति को इंटरसेक्शन टाइपों का उपयोग करके सटीक रूप से चित्रित किया जा सकता है।[4]
टाइपस्क्रिप्ट उदाहरण
टाइपस्क्रिप्ट इंटरसेक्शन टाइपों का समर्थन करता है,[5] प्रकार प्रणाली की अभिव्यक्ति में सुधार करता है और संभावित क्लास पदानुक्रम आकार को कम करता है, जो निम्नानुसार प्रदर्शित होता है।
निम्नलिखित प्रोग्राम कोड Chicken
, Cow
और RandomNumberGenerator
वर्गों को परिभाषित करता है, जिनमें से प्रत्येक के पास Egg
, Milk
या number
में से किसी प्रकार की ऑब्जेक्ट को वापस करने का एक तरीका है। इसके अतिरिक्त, eatEgg
और drinkMilk
फ़ंक्शन के लिए क्रमशः Egg
और Milk
प्रकार के तर्कों की आवश्यकता होती है।
class Egg { private kind: "Egg" }
class Milk { private kind: "Milk" }
//produces eggs
class Chicken { produce() { return new Egg(); } }
//produces milk
class Cow { produce() { return new Milk(); } }
//produces a random number
class RandomNumberGenerator { produce() { return Math.random(); } }
//requires an egg
function eatEgg(egg: Egg) {
return "I ate an egg.";
}
//requires milk
function drinkMilk(milk: Milk) {
return "I drank some milk.";
}
निम्नलिखित प्रोग्राम कोड तदर्थ बहुरूपी फ़ंक्शन animalToFood
को परिभाषित करता है जो दिए गए ऑब्जेक्ट animal
के सदस्य फ़ंक्शन produce
को आमंत्रित करता है। animalToFood
फ़ंक्शन में दो प्रकार के एनोटेशन हैं, अर्थात् ((_: Chicken) => Egg)
और ((_: Cow) => Milk)
, जो इंटरसेक्शन टाइप कंस्ट्रक्टर & के माध्यम से जुड़ा हुआ है। विशेष रूप से, animalToFood
जब Chicken
प्रकार के तर्क पर लागू किया जाता है तो Egg
प्रकार का एक ऑब्जेक्ट लौटाता है, और जब Cow
प्रकार के तर्क पर लागू किया जाता है तो Milk
प्रकार का ऑब्जेक्ट लौटाता है। आदर्श रूप से,animalToFood
किसी भी ऐसी ऑब्जेक्ट पर लागू नहीं होना चाहिए जिसमें (संभवतः संयोगवश) produce
विधि हो।
//given a chicken, produces an egg; given a cow, produces milk
let animalToFood: ((_: Chicken) => Egg) & ((_: Cow) => Milk) =
function (animal: any) {
return animal.produce();
};
अंत में, निम्नलिखित प्रोग्राम कोड उपरोक्त परिभाषाओं के सुरक्षित उपयोग को दर्शाता है।
var chicken = new Chicken();
var cow = new Cow();
var randomNumberGenerator = new RandomNumberGenerator();
console.log(chicken.produce()); //Egg { }
console.log(cow.produce()); //Milk { }
console.log(randomNumberGenerator.produce()); //0.2626353555444987
console.log(animalToFood(chicken)); //Egg { }
console.log(animalToFood(cow)); //Milk { }
//console.log(animalToFood(randomNumberGenerator)); //ERROR: Argument of type 'RandomNumberGenerator' is not assignable to parameter of type 'Cow'
console.log(eatEgg(animalToFood(chicken))); //I ate an egg.
//console.log(eatEgg(animalToFood(cow))); //ERROR: Argument of type 'Milk' is not assignable to parameter of type 'Egg'
console.log(drinkMilk(animalToFood(cow))); //I drank some milk.
//console.log(drinkMilk(animalToFood(chicken))); //ERROR: Argument of type 'Egg' is not assignable to parameter of type 'Milk'
उपरोक्त प्रोग्राम कोड में निम्नलिखित गुण हैं:
- लाइन्स 1-3 वस्तुएँ बनाती हैं
chicken
,cow
, औरrandomNumberGenerator
अपने-अपने प्रकार के है। - लाइन्स 5-7 पहले से बनाई गई वस्तुओं के लिए संबंधित परिणामों को प्रिंट करती हैं (टिप्पणियों के रूप में प्रदान की जाती हैं) जब
produce
अभिमंत्रित किया जाता है। - लाइन 9 (क्रमशः 10)
chicken
(क्रमशःcow
) पर लागूanimalToFood
विधि के प्रकार के सुरक्षित उपयोग को प्रदर्शित करती है। - लाइन 11, यदि टिप्पणी नहीं की गई, तो संकलन के समय एक प्रकार की त्रुटि उत्पन्न होगी। हालाँकि,
animalToFood
का कार्यान्वयनrandomNumberGenerator
कीproduce
विधि को लागू कर सकता है,animalToFood
का प्रकार एनोटेशन इसकी अनुमति नहीं देता है। यहanimalToFood
के अभीष्ट अर्थ के अनुरूप है। - लाइन 13 (क्रमशः 15) दर्शाती है कि
chicken
(क्रमशःcow
) परanimalToFood
लगाने सेEgg
(क्रमशःMilk
) जैसी ऑब्जेक्ट प्राप्त होती है। - लाइन 14 (क्रमशः 16) दर्शाती है कि
cow
(क्रमशःchicken
) कोanimalToFood
लगाने सेEgg
(क्रमशःMilk
) जैसी ऑब्जेक्ट नहीं मिलती है। इसलिए, अगर टिप्पणी नहीं की गई, तो पंक्ति 14 (क्रमशः 16) के परिणामस्वरूप संकलन के समय एक प्रकार की त्रुटि होगी।
अंतर्निहित से तुलना
उपरोक्त न्यूनतम उदाहरण को अंतर्निहित का उपयोग करके महसूस किया जा सकता है, उदाहरण के लिए आधार क्लास Animal
से Chicken
और Cow
क्लास प्राप्त करके। हालाँकि, बड़ी सेटिंग में, यह हानिकारक हो सकता है। क्लास पदानुक्रम में नई कक्षाओं का परिचय क्रॉस-कटिंग चिंताओं के लिए आवश्यक रूप से उचित नहीं है, या शायद पूरी तरह से असंभव है, उदाहरण के लिए बाहरी लाइब्रेरी का उपयोग करते समय। कल्पना कीजिए, उपरोक्त उदाहरण को निम्नलिखित कक्षाओं के साथ बढ़ाया जा सकता है:
- क्लास
Horse
जिसमें कोईproduce
विधि नहीं है। - क्लास
Sheep
जिसमें एकproduce
विधि और रिटर्निंगWool
है। - क्लास
Pig
जिसमें एक हैproduce
विधि, जिसका उपयोग केवल एक बार किया जा सकता है,Meat
रिटर्निंग के लिए है।
इसके लिए अतिरिक्त कक्षाओं (या इंटरफेस) की आवश्यकता हो सकती है जो यह निर्दिष्ट करती है कि क्या उपज विधि उपलब्ध है, क्या उपज विधि भोजन लौटाती है, और क्या उपज विधि का बार-बार उपयोग किया जा सकता है। कुल मिलाकर, इससे वर्ग पदानुक्रम प्रदूषित हो सकता है।
डक टाइपिंग से तुलना
उपरोक्त न्यूनतम उदाहरण पहले से ही दिखाता है कि डक टाइपिंग दिए गए परिदृश्य को समझने के लिए कम उपयुक्त है। जबकि क्लास RandomNumberGenerator
में produce
विधि सम्मिलित है, ऑब्जेक्ट RandomNumberGenerator
कोanimalToFood
के लिए एक वैध तर्क नहीं होना चाहिए। उपरोक्त उदाहरण को डक टाइपिंग का उपयोग करके महसूस किया जा सकता है, उदाहरण के लिए Chicken
और Cow
वर्गों के लिए नया फ़ील्ड argumentForAnimalToFood
पेश करके यह दर्शाया गया है कि संबंधित प्रकार की वस्तुएं animalToFood
के लिए वैध तर्क हैं। हालाँकि, इससे न केवल संबंधित वर्गों का आकार बढ़ेगा (विशेष रूप से animalToFood
के समान अधिक तरीकों की प्रारम्भ के साथ), बल्कि animalToFood
के संबंध में गैर-स्थानीय दृष्टिकोण भी है।
फ़ंक्शन ओवरलोडिंग से तुलना
उपरोक्त उदाहरण को फ़ंक्शन ओवरलोडिंग का उपयोग करके महसूस किया जा सकता है, उदाहरण के लिए दो तरीकों को लागू करके animalToFood(animal: Chicken): Egg
और animalToFood(animal: Cow): Milk
.टाइपस्क्रिप्ट में, ऐसा समाधान दिए गए उदाहरण के लगभग समान है।अन्य प्रोग्रामिंग भाषाओं, जैसे Java_(प्रोग्रामिंग_भाषा) को अतिभारित पद्धति के विशिष्ट कार्यान्वयन की आवश्यकता होती है। इससे या तो कोड दोहराव या बॉयलरप्लेट कोड हो सकता है।
विज़िटर पैटर्न की तुलना
उपरोक्त उदाहरण को विज़िटर पैटर्न का उपयोग करके महसूस किया जा सकता है। इसे लागू करने के लिए प्रत्येक पशु क्लास की आवश्यकता होगी accept
इंटरफ़ेस को कार्यान्वित करने वाली किसी ऑब्जेक्ट को स्वीकार करने की विधि AnimalVisitor
(गैर-स्थानीय बॉयलरप्लेट कोड जोड़ना)। कार्यक्रम animalToFood
के रूप में साकार किया जाएगा visit
के कार्यान्वयन की विधि AnimalVisitor
.दुर्भाग्य से, इनपुट प्रकार के बीच संबंध (Chicken
या Cow
) और परिणाम प्रकार (Egg
या Milk
) का प्रतिनिधित्व करना कठिन होगा।
सीमाएँ
एक ओर, वर्ग पदानुक्रम में नए वर्गों (या इंटरफेस) को पेश किए बिना किसी फ़ंक्शन में विभिन्न प्रकारों को स्थानीय रूप से एनोटेट करने के लिए चौराहे प्रकारों का उपयोग किया जा सकता है। दूसरी ओर, इस दृष्टिकोण के लिए सभी संभावित तर्क प्रकारों और परिणाम प्रकारों को स्पष्ट रूप से निर्दिष्ट करना आवश्यक है। यदि किसी फ़ंक्शन के व्यवहार को एकीकृत इंटरफ़ेस, पैरामीट्रिक बहुरूपता, या डक टाइपिंग द्वारा सटीक रूप से निर्दिष्ट किया जा सकता है, तो इंटरसेक्शन टाइपों की क्रिया प्रकृति प्रतिकूल है। इसलिए, इंटरसेक्शन टाइपों को उपस्थित विशिष्टीकरण विधियों का पूरक माना जाना चाहिए।
डिपेंडेंट इंटरसेक्शन टाइप
डिपेंडेंट इंटरसेक्शन टाइप, जिसे दर्शाया गया है, डिपेंडेंट प्रकार है जिसमें प्रकार शब्द चर पर डिपेंडेंट हो सकता है।[6] विशेष रूप से, यदि किसी पद में डिपेंडेंट इंटरसेक्शन टाइप है, तो पद में प्रकार और प्रकार दोनों हैं, जहां है वह प्रकार जो शब्द वेरिएबल की सभी घटनाओं को में शब्द द्वारा प्रतिस्थापित करने के परिणामस्वरूप प्राप्त होता है।
स्काला उदाहरण
स्काला (प्रोग्रामिंग भाषा) प्रकार की घोषणाओं का समर्थन करती है [7] ऑब्जेक्ट सदस्यों के रूप में। यह किसी ऑब्जेक्ट सदस्य के प्रकार को किसी अन्य सदस्य के मान पर डिपेंडेंट करने की अनुमति देता है, जिसे पथ-डिपेंडेंट प्रकार कहा जाता है।[8] उदाहरण के लिए, निम्नलिखित प्रोग्राम टेक्स्ट स्काला विशेषता को परिभाषित करता है Witness
, जिसका उपयोग सिंगलटन पैटर्न को लागू करने के लिए किया जा सकता है।[9]
trait Witness {
type T
val value: T {}
}
उपरोक्त विशेषता Witness
सदस्य T
को घोषित करता है, जिसे इसके value
के रूप में एक प्रकार सौंपा जा सकता है, और सदस्य मान, जिसे प्रकार T
का मान सौंपा जा सकता है। निम्नलिखित प्रोग्राम पाठ उपरोक्त विशेषता Witness
के उदाहरण के रूप में एक ऑब्जेक्ट booleanWitness
को परिभाषित करता है। ऑब्जेक्ट booleanWitness
प्रकार T
को Boolean
और value
को true
के रूप में परिभाषित करता है। उदाहरण के लिएSystem.out.println(booleanWitness.value)
, को निष्पादित करने से कंसोल पर true
प्रिंट होता है।
object booleanWitness extends Witness {
type T = Boolean
val value = true
}
मान लीजिये सदस्य वाली वस्तुओं का प्रकार (विशेष रूप से, रिकॉर्ड (कंप्यूटर विज्ञान)) हो प्रकार का .
उपरोक्त उदाहरण में, object booleanWitness
डिपेंडेंट इंटरसेक्शन टाइप निर्दिष्ट किया जा सकता है . तर्क इस प्रकार है. जो ऑब्जेक्ट booleanWitness
सदस्य है T
वह प्रकार असाइन किया गया है Boolean
इसके मूल्य के रूप में.
तब से Boolean
एक प्रकार है, ऑब्जेक्ट है booleanWitness
प्रकार है . इसके अतिरिक्त, ऑब्जेक्ट booleanWitness
सदस्य है value
वह मान असाइन किया गया है true
प्रकार का Boolean
.के मूल्य के बाद से booleanWitness.T
है Boolean
, जो ऑब्जेक्ट booleanWitness
प्रकार है। कुल मिलाकर, ऑब्जेक्ट booleanWitness
इंटरसेक्शन टाइप है अत: स्व-संदर्भ को निर्भरता, ऑब्जेक्ट के रूप में प्रस्तुत करना booleanWitness
डिपेंडेंट इंटरसेक्शन टाइप है।
वैकल्पिक रूप से, उपरोक्त न्यूनतम उदाहरण को डिपेंडेंट रिकॉर्ड प्रकारों का उपयोग करके वर्णित किया जा सकता है।[10] डिपेंडेंट इंटरसेक्शन टाइपों की तुलना में, डिपेंडेंट रिकॉर्ड प्रकार अधिक विशिष्ट प्रकार की सैद्धांतिक अवधारणा का गठन करते हैं।[6]
प्रकार के वर्ग का प्रतिच्छेदन
प्रकार के परिवार का प्रतिच्छेदन, जिसे दर्शाया जाता है, डिपेंडेंट प्रकार है जिसमें प्रकार शब्द चर पर निर्भर हो सकता है। विशेष रूप से, यदि किसी पद का प्रकार है, तो प्रकार के प्रत्येक पद के लिए, पद का प्रकार है।[11] इस धारणा को अंतर्निहित पाई प्रकार भी कहा जाता है, [11] यह देखते हुए कि तर्क को पद स्तर पर नहीं रखा गया है।
अन्तर्विभाजक प्रकारों वाली भाषाओं की तुलना
भाषा | सक्रिय रूप से विकसित | उदाहरण | स्थिति | विशेषताएँ |
---|---|---|---|---|
C# | Yes[12] | Under discussion[13] | इसके अतिरिक्त, सामान्य प्रकार के पैरामीटर में बाधाएं हो सकती हैं जिनके लिए कई इंटरफेस को लागू करने के लिए उनके (मोनोमोर्फाइज्ड) प्रकार-तर्कों की आवश्यकता होती है, जिसके बाद जेनेरिक प्रकार पैरामीटर द्वारा दर्शाया गया रनटाइम प्रकार सभी सूचीबद्ध इंटरफेस का एक प्रतिच्छेदन-प्रकार बन जाता है। | |
Ceylon | Yes[14] | Supported[15] |
| |
F# | Yes[16] | Under discussion[17] | ? | |
Flow | Yes[18] | Supported[19] |
| |
Forsythe | No | Supported[20] |
| |
Java | Yes[21] | Supported[22] |
| |
PHP | Yes[23] | Supported[24] |
| |
Scala | Yes[25] | Supported[26][27] |
| |
TypeScript | Yes[28] | Supported[5] |
| |
Whiley | Yes[29] | Supported[30] | ? |
संदर्भ
- ↑ Barendregt, Henk; Coppo, Mario; Dezani-Ciancaglini, Mariangiola (1983). "एक फ़िल्टर लैम्ब्डा मॉडल और प्रकार असाइनमेंट की पूर्णता". Journal of Symbolic Logic. 48 (4): 931–940. doi:10.2307/2273659. JSTOR 2273659. S2CID 45660117.
- ↑ Palsberg, Jens (2012). "Overloading is NP-Complete". तर्क और कार्यक्रम शब्दार्थ. Lecture Notes in Computer Science. Vol. 7230. pp. 204–218. doi:10.1007/978-3-642-29485-3_13. ISBN 978-3-642-29484-6.
- ↑ Henk Barendregt; Wil Dekkers; Richard Statman (20 June 2013). लैम्ब्डा कैलकुलस प्रकार के साथ. Cambridge University Press. pp. 1–. ISBN 978-0-521-76614-2.
- ↑ Ghilezan, Silvia (1996). "प्रतिच्छेदन प्रकारों के साथ मजबूत सामान्यीकरण और टाइपेबिलिटी". Notre Dame Journal of Formal Logic. 37 (1): 44–52. doi:10.1305/ndjfl/1040067315.
- ↑ 5.0 5.1 "Intersection Types in TypeScript". Retrieved 2019-08-01.
- ↑ 6.0 6.1 Kopylov, Alexei (2003). "Dependent intersection: A new way of defining records in type theory". 18th IEEE Symposium on Logic in Computer Science. LICS 2003. IEEE Computer Society. pp. 86–95. CiteSeerX 10.1.1.89.4223. doi:10.1109/LICS.2003.1210048.
- ↑ "स्कैला में घोषणाएँ टाइप करें". Retrieved 2019-08-15.
- ↑ Amin, Nada; Grütter, Samuel; Odersky, Martin; Rompf, Tiark; Stucki, Sandro (2016). "The essence of dependent object types" (PDF). Lecture Notes in Computer Science. A List of Successes That Can Change the World - Essays Dedicated to Philip Wadler on the Occasion of His 60th Birthday. Springer. 9600: 249–272. doi:10.1007/978-3-319-30936-1_14. ISBN 978-3-319-30935-4.
- ↑ "स्काला आकारहीन पुस्तकालय में सिंगलटन". GitHub. Retrieved 2019-08-15.
- ↑ Pollack, Robert (2000). "गणितीय संरचना का प्रतिनिधित्व करने के लिए निर्भरता से टाइप किए गए रिकॉर्ड". Theorem Proving in Higher Order Logics, 13th International Conference. TPHOLs 2000. Springer. pp. 462–479. doi:10.1007/3-540-44659-1_29.
- ↑ Stump, Aaron (2018). "बोधगम्यता से आश्रित प्रतिच्छेदन के माध्यम से प्रेरण तक". Annals of Pure and Applied Logic. 169 (7): 637–655. doi:10.1016/j.apal.2018.03.002.
- ↑ "C# Guide". Retrieved 2019-08-08.
- ↑ "Discussion: Union and Intersection types in C Sharp". GitHub. Retrieved 2019-08-08.
- ↑ "Eclipse Ceylon: Welcom to Ceylon". Retrieved 2019-08-08.
- ↑ "Intersection Types in Ceylon". Retrieved 2019-08-08.
- ↑ "F# Software Foundation". Retrieved 2019-08-08.
- ↑ "Add Intersection Types to F Sharp". GitHub. Retrieved 2019-08-08.
- ↑ "Flow: A Static Type Checker for JavaScript". Retrieved 2019-08-08.
- ↑ "Intersection Type Syntax in Flow". Retrieved 2019-08-08.
- ↑ Reynolds, J. C. (1988). Preliminary design of the programming language Forsythe.
- ↑ "Java Software". Retrieved 2019-08-08.
- ↑ "IntersectionType (Java SE 12 & JDK 12)". Retrieved 2019-08-01.
- ↑ "php.net".
- ↑ "PHP.Watch - PHP 8.1: Intersection Types".
- ↑ "The Scala Programming Language". Retrieved 2019-08-08.
- ↑ "Compound Types in Scala". Retrieved 2019-08-01.
- ↑ "Intersection Types in Dotty". Retrieved 2019-08-01.
- ↑ "TypeScript - JavaScript that scales". Retrieved 2019-08-01.
- ↑ "Whiley: an Open Source Programming Language with Extended Static Checking". Retrieved 2019-08-01.
- ↑ "Whiley language specification" (PDF). Retrieved 2019-08-01.