इंटरसेक्शन टाइप

प्रकार सिद्धांत में, एक इंटरसेक्शन टाइप को उन मानों के लिए आवंटित किया जा सकता है जिन्हें प्रकार $$\sigma$$ और प्रकार $$\tau$$ दोनों को सौंपा जा सकता है। इस मान को प्रतिच्छेदन-प्रकार प्रणाली में इंटरसेक्शन टाइप $$\sigma \cap \tau$$ दिया जा सकता है। सामान्यतः, यदि दो प्रकार के मानों की श्रेणियां ओवरलैप होती हैं, तो दो श्रेणियों के प्रतिच्छेदन से संबंधित मान को इन दो प्रकारों के इंटरसेक्शन टाइप को सौंपा जा सकता है। इस तरह के मान को दोनों प्रकारों में से किसी की अपेक्षा वाले कार्यों के लिए तर्क के रूप में सुरक्षित रूप से पारित किया जा सकता है। उदाहरण के लिए, जावा में, क्लास BooleanSerializable और Comparable दोनों इंटरफेस लागू करता है। इसलिए, Booleanप्रकार की ऑब्जेक्ट को Serializableप्रकार के तर्क की अपेक्षा करने वाले कार्यों के लिए और Comparableप्रकार के तर्क की अपेक्षा करने वाले कार्यों के लिए सुरक्षित रूप से पारित किया जा सकता है।

प्रतिच्छेदन समग्र डेटा प्रकार प्रकार हैं। उत्पाद प्रकारों के समान, इनका उपयोग किसी ऑब्जेक्ट को कई प्रकार निर्दिष्ट करने के लिए किया जाता है। हालाँकि, उत्पाद प्रकार टुपल्स को सौंपे जाते हैं, ताकि प्रत्येक टुपल तत्व को विशेष उत्पाद प्रकार घटक सौंपा जा सके। इसकी तुलना में, इंटरसेक्शन टाइप की अंतर्निहित वस्तुएं जरूरी नहीं कि समग्र हों। इंटरसेक्शन टाइपों का प्रतिबंधित रूप परिशोधन प्रकार है।

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

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

इंटरसेक्शन टाइपों के सैद्धांतिक अध्ययन को इंटरसेक्शन टाइप अनुशासन के रूप में जाना जाता है। उल्लेखनीय रूप से, कार्यक्रम समाप्ति को इंटरसेक्शन टाइपों का उपयोग करके सटीक रूप से चित्रित किया जा सकता है।

टाइपस्क्रिप्ट उदाहरण
टाइपस्क्रिप्ट इंटरसेक्शन टाइपों का समर्थन करता है, प्रकार प्रणाली की अभिव्यक्ति में सुधार करता है और संभावित क्लास पदानुक्रम आकार को कम करता है, जो निम्नानुसार प्रदर्शित होता है।

निम्नलिखित प्रोग्राम कोड, और वर्गों को परिभाषित करता है, जिनमें से प्रत्येक के पास , या  में से किसी प्रकार की ऑब्जेक्ट को वापस करने का एक तरीका है। इसके अतिरिक्त,  और फ़ंक्शन के लिए क्रमशः और  प्रकार के तर्कों की आवश्यकता होती है।

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

अंत में, निम्नलिखित प्रोग्राम कोड उपरोक्त परिभाषाओं के सुरक्षित उपयोग को दर्शाता है। उपरोक्त प्रोग्राम कोड में निम्नलिखित गुण हैं:
 * लाइन्स 1-3 वस्तुएँ बनाती हैं, , और अपने-अपने प्रकार के है।
 * लाइन्स 5-7 पहले से बनाई गई वस्तुओं के लिए संबंधित परिणामों को प्रिंट करती हैं (टिप्पणियों के रूप में प्रदान की जाती हैं) जब अभिमंत्रित किया जाता है।
 * लाइन 9 (क्रमशः 10) (क्रमशः ) पर लागू  विधि के प्रकार के सुरक्षित उपयोग को प्रदर्शित करती है।
 * लाइन 11, यदि टिप्पणी नहीं की गई, तो संकलन के समय एक प्रकार की त्रुटि उत्पन्न होगी। हालाँकि, का कार्यान्वयन की  विधि को लागू कर सकता है, का प्रकार एनोटेशन इसकी अनुमति नहीं देता है। यह के अभीष्ट अर्थ के अनुरूप है।
 * लाइन 13 (क्रमशः 15) दर्शाती है कि (क्रमशः ) पर  लगाने से  (क्रमशः ) जैसी ऑब्जेक्ट प्राप्त होती है।
 * लाइन 14 (क्रमशः 16) दर्शाती है कि (क्रमशः) को लगाने से (क्रमशः) जैसी ऑब्जेक्ट नहीं मिलती है। इसलिए, अगर टिप्पणी नहीं की गई, तो पंक्ति 14 (क्रमशः 16) के परिणामस्वरूप संकलन के समय एक प्रकार की त्रुटि होगी।

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

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

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

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

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

डिपेंडेंट इंटरसेक्शन टाइप
डिपेंडेंट इंटरसेक्शन टाइप, जिसे $$(x : \sigma) \cap \tau$$ दर्शाया गया है, डिपेंडेंट प्रकार है जिसमें प्रकार $$\tau$$ शब्द चर $$x$$ पर डिपेंडेंट हो सकता है। विशेष रूप से, यदि किसी पद $$M$$ में डिपेंडेंट इंटरसेक्शन टाइप $$(x : \sigma) \cap \tau$$ है, तो पद $$M$$ में प्रकार $$\sigma$$ और प्रकार $$\tau[x := M]$$दोनों हैं, जहां $$\tau[x := M]$$है वह प्रकार जो शब्द वेरिएबल $$x$$ की सभी घटनाओं को $$\tau$$ में शब्द $$M$$ द्वारा प्रतिस्थापित करने के परिणामस्वरूप प्राप्त होता है।

स्काला उदाहरण
स्काला (प्रोग्रामिंग भाषा) प्रकार की घोषणाओं का समर्थन करती है ऑब्जेक्ट सदस्यों के रूप में। यह किसी ऑब्जेक्ट सदस्य के प्रकार को किसी अन्य सदस्य के मान पर डिपेंडेंट करने की अनुमति देता है, जिसे पथ-डिपेंडेंट प्रकार कहा जाता है। उदाहरण के लिए, निम्नलिखित प्रोग्राम टेक्स्ट स्काला विशेषता को परिभाषित करता है, जिसका उपयोग सिंगलटन पैटर्न को लागू करने के लिए किया जा सकता है। उपरोक्त विशेषता सदस्य   को घोषित करता है, जिसे इसके  के रूप में एक प्रकार सौंपा जा सकता है, और सदस्य मान, जिसे प्रकार   का मान सौंपा जा सकता है। निम्नलिखित प्रोग्राम पाठ उपरोक्त विशेषता  के उदाहरण के रूप में एक ऑब्जेक्ट  को परिभाषित करता है। ऑब्जेक्ट   प्रकार   को  और  को   के रूप में परिभाषित करता है। उदाहरण के लिए,  को निष्पादित करने से कंसोल पर   प्रिंट होता है। मान लीजिये $$\langle \textsf{x} : \sigma \rangle$$ सदस्य वाली वस्तुओं का प्रकार (विशेष रूप से, रिकॉर्ड (कंप्यूटर विज्ञान)) हो $$\textsf{x}$$ प्रकार का $$\sigma$$. उपरोक्त उदाहरण में, object  डिपेंडेंट इंटरसेक्शन टाइप निर्दिष्ट किया जा सकता है $$(x : \langle \textsf{T} : \text{Type} \rangle) \cap \langle \textsf{value} : x.\textsf{T} \rangle$$. तर्क इस प्रकार है. जो ऑब्जेक्ट  सदस्य है   वह प्रकार असाइन किया गया है   इसके मूल्य के रूप में. तब से  एक प्रकार है, ऑब्जेक्ट है   प्रकार है $$\langle \textsf{T} : \text{Type} \rangle$$. इसके अतिरिक्त, ऑब्जेक्ट  सदस्य है   वह मान असाइन किया गया है   प्रकार का  .के मूल्य के बाद से   है , जो ऑब्जेक्ट   $$\langle \textsf{value} : \textsf{booleanWitness.T} \rangle$$प्रकार है। कुल मिलाकर, ऑब्जेक्ट   $$\langle \textsf{T} : \text{Type} \rangle \cap \langle \textsf{value} : \textsf{booleanWitness.T} \rangle$$इंटरसेक्शन टाइप है अत: स्व-संदर्भ को निर्भरता, ऑब्जेक्ट के रूप में प्रस्तुत करना   डिपेंडेंट इंटरसेक्शन टाइप$$(x : \langle \textsf{T} : \text{Type} \rangle) \cap \langle \textsf{value} : x.\textsf{T} \rangle$$ है।

वैकल्पिक रूप से, उपरोक्त न्यूनतम उदाहरण को डिपेंडेंट रिकॉर्ड प्रकारों का उपयोग करके वर्णित किया जा सकता है। डिपेंडेंट इंटरसेक्शन टाइपों की तुलना में, डिपेंडेंट रिकॉर्ड प्रकार अधिक विशिष्ट प्रकार की सैद्धांतिक अवधारणा का गठन करते हैं।

प्रकार के वर्ग का प्रतिच्छेदन
प्रकार के परिवार का प्रतिच्छेदन, जिसे $\bigcap_{x : \sigma} \tau$ दर्शाया जाता है, डिपेंडेंट प्रकार है जिसमें प्रकार $$\tau$$ शब्द चर $$x$$ पर निर्भर हो सकता है। विशेष रूप से, यदि किसी पद $$M$$ का प्रकार $\bigcap_{x : \sigma} \tau$  है, तो $$\sigma$$ प्रकार के प्रत्येक पद $$N$$ के लिए, पद $$M$$ का प्रकार $$\tau[x := N]$$है। इस धारणा को अंतर्निहित पाई प्रकार भी कहा जाता है, [11] यह देखते हुए कि तर्क $$N$$ को पद स्तर पर नहीं रखा गया है।