इंटरसेक्शन टाइप: Difference between revisions

From Vigyanwiki
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}}प्रकार के तर्क की अपेक्षा करने वाले कार्यों के लिए सुरक्षित रूप से पारित किया जा सकता है।
[[प्रकार सिद्धांत]] में, एक प्रतिच्छेदन प्रकार को उन मानों के लिए आवंटित किया जा सकता है जिन्हें प्रकार <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 |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}}फ़ंक्शन का प्रकार है जो स्ट्रिंग को तर्क के रूप में लेता है और स्ट्रिंग लौटाता है, तो इनका प्रतिच्छेदन होता है दो प्रकारों का उपयोग उन (अतिभारित) कार्यों का वर्णन करने के लिए किया जा सकता है जो एक या दूसरे कार्य करते हैं, यह इस पर डिपेंडेंट करता है कि उन्हें किस प्रकार का इनपुट दिया गया है।


[[सीलोन (प्रोग्रामिंग भाषा)|सीलोन]], फ्लो, [[जावा (प्रोग्रामिंग भाषा)|जावा]], [[स्काला (प्रोग्रामिंग भाषा)|स्काला]], टाइपस्क्रिप्ट और वाइली (प्रतिच्छेदन प्रकारों के साथ भाषाओं की तुलना देखें) सहित समकालीन प्रोग्रामिंग भाषाएं, इंटरफ़ेस विशिष्टताओं को संयोजित करने और तदर्थ बहुरूपता को व्यक्त करने के लिए प्रतिच्छेदन प्रकारों का उपयोग करती हैं। पैरामीट्रिक बहुरूपता को लागू करते हुए, क्रॉस-कटिंग चिंताओं से क्लास पदानुक्रम प्रदूषण से बचने और [[बॉयलरप्लेट कोड]] को कम करने के लिए प्रतिच्छेदन प्रकारों का उपयोग किया जा सकता है, जैसा कि नीचे टाइपस्क्रिप्ट उदाहरण में दिखाया गया है।
[[सीलोन (प्रोग्रामिंग भाषा)|सीलोन]], फ्लो, [[जावा (प्रोग्रामिंग भाषा)|जावा]], [[स्काला (प्रोग्रामिंग भाषा)|स्काला]], टाइपस्क्रिप्ट और वाइली (प्रतिच्छेदन प्रकारों के साथ भाषाओं की तुलना देखें) सहित समकालीन प्रोग्रामिंग भाषाएं, इंटरफ़ेस विशिष्टताओं को संयोजित करने और तदर्थ बहुरूपता को व्यक्त करने के लिए प्रतिच्छेदन प्रकारों का उपयोग करती हैं। पैरामीट्रिक बहुरूपता को लागू करते हुए, क्रॉस-कटिंग चिंताओं से क्लास पदानुक्रम प्रदूषण से बचने और [[बॉयलरप्लेट कोड]] को कम करने के लिए प्रतिच्छेदन प्रकारों का उपयोग किया जा सकता है, जैसा कि नीचे टाइपस्क्रिप्ट उदाहरण में दिखाया गया है।
Line 13: Line 13:
टाइपस्क्रिप्ट प्रतिच्छेदन प्रकारों का समर्थन करता है,<ref name=TS/> प्रकार प्रणाली की अभिव्यक्ति में सुधार करता है और संभावित क्लास पदानुक्रम आकार को कम करता है, जो निम्नानुसार प्रदर्शित होता है।
टाइपस्क्रिप्ट प्रतिच्छेदन प्रकारों का समर्थन करता है,<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}} प्रकार के तर्कों की आवश्यकता होती है।
निम्नलिखित प्रोग्राम कोड {{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 38: 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}} को परिभाषित करता है जो दिए गए ऑब्जेक्ट {{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}}विधि हो।


<syntaxhighlight lang="typescript">
<syntaxhighlight lang="typescript">
Line 71: Line 71:
*लाइन 9 (क्रमशः 10) {{TS-lang|chicken}} (क्रमशः {{TS-lang|cow}}) पर लागू {{TS-lang|animalToFood}} विधि के प्रकार के सुरक्षित उपयोग को प्रदर्शित करती है।
*लाइन 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}}के अभीष्ट अर्थ के अनुरूप है।
* लाइन 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}}) जैसी वस्तु प्राप्त होती है।
*लाइन 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) के परिणामस्वरूप संकलन के समय एक प्रकार की त्रुटि होगी।
*लाइन 14 (क्रमशः 16) दर्शाती है कि {{TS-lang|cow}}(क्रमशः{{TS-lang|chicken}}) को {{TS-lang|animalToFood}} लगाने से {{TS-lang|Egg}}(क्रमशः{{TS-lang|Milk}}) जैसी ऑब्जेक्ट नहीं मिलती है। इसलिए, अगर टिप्पणी नहीं की गई, तो पंक्ति 14 (क्रमशः 16) के परिणामस्वरूप संकलन के समय एक प्रकार की त्रुटि होगी।


===अंतर्निहित से तुलना===
===अंतर्निहित से तुलना===
Line 88: Line 88:


=== विज़िटर पैटर्न की तुलना ===
=== विज़िटर पैटर्न की तुलना ===
उपरोक्त उदाहरण को विज़िटर पैटर्न का उपयोग करके महसूस किया जा सकता है। इसे लागू करने के लिए प्रत्येक पशु क्लास की आवश्यकता होगी {{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|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}}) का प्रतिनिधित्व करना कठिन होगा।


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


== आश्रित प्रतिच्छेदन प्रकार ==
== डिपेंडेंट प्रतिच्छेदन प्रकार ==
एक आश्रित प्रतिच्छेदन प्रकार, दर्शाया गया <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>(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> द्वारा प्रतिस्थापित करने के परिणामस्वरूप प्राप्त होता है।
विशेष रूप से, यदि कोई शब्द <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>
स्काला (प्रोग्रामिंग भाषा) प्रकार की घोषणाओं का समर्थन करती है <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 107: Line 105:
}
}
</syntaxhighlight>
</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>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" inline>booleanWitness</syntaxhighlight> उपरोक्त विशेषता के उदाहरण के रूप में <syntaxhighlight lang="Scala" inline>Witness </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 117: Line 112:
}
}
</syntaxhighlight>
</syntaxhighlight>
होने देना <math>\langle \textsf{x} : \sigma \rangle</math> सदस्य वाली वस्तुओं का प्रकार (विशेष रूप से, एक [[रिकॉर्ड (कंप्यूटर विज्ञान)]]) हो <math>\textsf{x}</math> प्रकार का <math>\sigma</math>.
मान लीजिये <math>\langle \textsf{x} : \sigma \rangle</math> सदस्य वाली वस्तुओं का प्रकार (विशेष रूप से, एक [[रिकॉर्ड (कंप्यूटर विज्ञान)]]) हो <math>\textsf{x}</math> प्रकार का <math>\sigma</math>.
उपरोक्त उदाहरण में, object <syntaxhighlight lang="Scala" inline>booleanWitness</syntaxhighlight> आश्रित प्रतिच्छेदन प्रकार निर्दिष्ट किया जा सकता है <math>(x : \langle \textsf{T} : \text{Type} \rangle) \cap \langle \textsf{value} : x.\textsf{T} \rangle</math>.
उपरोक्त उदाहरण में, 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>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</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>.
 
वैकल्पिक रूप से, उपरोक्त न्यूनतम उदाहरण को आश्रित रिकॉर्ड प्रकारों का उपयोग करके वर्णित किया जा सकता है।<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/>
 


वैकल्पिक रूप से, उपरोक्त न्यूनतम उदाहरण को डिपेंडेंट रिकॉर्ड प्रकारों का उपयोग करके वर्णित किया जा सकता है।<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>N</math> प्रकार का <math>\sigma</math>, शब्द <math>M</math> प्रकार है <math>\tau[x := N]</math>. इस धारणा को अंतर्निहित आश्रित प्रकार#Pi प्रकार भी कहा जाता है,<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> उस तर्क को देखते हुए <math>N</math> टर्म स्तर पर नहीं रखा गया है.
एक प्रकार के परिवार का एक प्रतिच्छेदन, निरूपित <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>N</math> प्रकार का <math>\sigma</math>, शब्द <math>M</math> प्रकार है <math>\tau[x := N]</math>. इस धारणा को अंतर्निहित डिपेंडेंट प्रकार#Pi प्रकार भी कहा जाता है,<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> उस तर्क को देखते हुए <math>N</math> टर्म स्तर पर नहीं रखा गया है.


== प्रतिच्छेदन प्रकारों वाली भाषाओं की तुलना ==
== प्रतिच्छेदन प्रकारों वाली भाषाओं की तुलना ==

Revision as of 11:07, 17 July 2023

प्रकार सिद्धांत में, एक प्रतिच्छेदन प्रकार को उन मानों के लिए आवंटित किया जा सकता है जिन्हें प्रकार और प्रकार दोनों को सौंपा जा सकता है। इस मान को एक प्रतिच्छेदन-प्रकार प्रणाली में प्रतिच्छेदन प्रकार दिया जा सकता है।[1] आम तौर पर, यदि दो प्रकार के मानों की श्रेणियां ओवरलैप होती हैं, तो दो श्रेणियों के प्रतिच्छेदन से संबंधित मान को इन दो प्रकारों के प्रतिच्छेदन प्रकार को सौंपा जा सकता है। इस तरह के मान को दोनों प्रकारों में से किसी एक की अपेक्षा वाले कार्यों के लिए एक तर्क के रूप में सुरक्षित रूप से पारित किया जा सकता है। उदाहरण के लिए, जावा में, क्लास BooleanSerializable और 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]

एक प्रकार के परिवार का प्रतिच्छेदन

एक प्रकार के परिवार का एक प्रतिच्छेदन, निरूपित , एक डिपेंडेंट प्रकार है जिसमें प्रकार चर शब्द पर डिपेंडेंट हो सकता है . विशेष रूप से, यदि कोई शब्द प्रकार है , फिर प्रत्येक पद के लिए प्रकार का , शब्द प्रकार है . इस धारणा को अंतर्निहित डिपेंडेंट प्रकार#Pi प्रकार भी कहा जाता है,[11] उस तर्क को देखते हुए टर्म स्तर पर नहीं रखा गया है.

प्रतिच्छेदन प्रकारों वाली भाषाओं की तुलना

Language Actively developed Paradigm(s) Status Features
C# Yes[12] Under discussion[13] Additionally, generic type parameters can have constraints that require their (monomorphized) type-arguments to implement multiple interfaces, whereupon the runtime type represented by the generic type parameter becomes an intersection-type of all listed interfaces.
Ceylon Yes[14] Supported[15]
  • Type refinement
  • Interface composition
  • Subtyping in width
F# Yes[16] Under discussion[17] ?
Flow Yes[18] Supported[19]
  • Type refinement
  • Interface composition
Forsythe No Supported[20]
  • Function type intersection
  • Distributive, co- and contravariant function type subtyping
Java Yes[21] Supported[22]
  • Type refinement
  • Interface composition
  • Subtyping in width
PHP Yes[23] Supported[24]
  • Type refinement
  • Interface composition
Scala Yes[25] Supported[26][27]
  • Type refinement
  • Trait composition
  • Subtyping in width
TypeScript Yes[28] Supported[5]
  • Arbitrary type intersection
  • Interface composition
  • Subtyping in width and depth
Whiley Yes[29] Supported[30] ?


संदर्भ

  1. Barendregt, Henk; Coppo, Mario; Dezani-Ciancaglini, Mariangiola (1983). "एक फ़िल्टर लैम्ब्डा मॉडल और प्रकार असाइनमेंट की पूर्णता". Journal of Symbolic Logic. 48 (4): 931–940. doi:10.2307/2273659. JSTOR 2273659. S2CID 45660117.
  2. 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.
  3. Henk Barendregt; Wil Dekkers; Richard Statman (20 June 2013). लैम्ब्डा कैलकुलस प्रकार के साथ. Cambridge University Press. pp. 1–. ISBN 978-0-521-76614-2.
  4. Ghilezan, Silvia (1996). "प्रतिच्छेदन प्रकारों के साथ मजबूत सामान्यीकरण और टाइपेबिलिटी". Notre Dame Journal of Formal Logic. 37 (1): 44–52. doi:10.1305/ndjfl/1040067315.
  5. 5.0 5.1 "Intersection Types in TypeScript". Retrieved 2019-08-01.
  6. 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.
  7. "स्कैला में घोषणाएँ टाइप करें". Retrieved 2019-08-15.
  8. 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.
  9. "स्काला आकारहीन पुस्तकालय में सिंगलटन". GitHub. Retrieved 2019-08-15.
  10. 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.
  11. Stump, Aaron (2018). "बोधगम्यता से आश्रित प्रतिच्छेदन के माध्यम से प्रेरण तक". Annals of Pure and Applied Logic. 169 (7): 637–655. doi:10.1016/j.apal.2018.03.002.
  12. "C# Guide". Retrieved 2019-08-08.
  13. "Discussion: Union and Intersection types in C Sharp". GitHub. Retrieved 2019-08-08.
  14. "Eclipse Ceylon: Welcom to Ceylon". Retrieved 2019-08-08.
  15. "Intersection Types in Ceylon". Retrieved 2019-08-08.
  16. "F# Software Foundation". Retrieved 2019-08-08.
  17. "Add Intersection Types to F Sharp". GitHub. Retrieved 2019-08-08.
  18. "Flow: A Static Type Checker for JavaScript". Retrieved 2019-08-08.
  19. "Intersection Type Syntax in Flow". Retrieved 2019-08-08.
  20. Reynolds, J. C. (1988). Preliminary design of the programming language Forsythe.
  21. "Java Software". Retrieved 2019-08-08.
  22. "IntersectionType (Java SE 12 & JDK 12)". Retrieved 2019-08-01.
  23. "php.net".
  24. "PHP.Watch - PHP 8.1: Intersection Types".
  25. "The Scala Programming Language". Retrieved 2019-08-08.
  26. "Compound Types in Scala". Retrieved 2019-08-01.
  27. "Intersection Types in Dotty". Retrieved 2019-08-01.
  28. "TypeScript - JavaScript that scales". Retrieved 2019-08-01.
  29. "Whiley: an Open Source Programming Language with Extended Static Checking". Retrieved 2019-08-01.
  30. "Whiley language specification" (PDF). Retrieved 2019-08-01.