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

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

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

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

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

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

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

निम्नलिखित प्रोग्राम कोड कक्षाओं को परिभाषित करता है, , और कि प्रत्येक के पास एक विधि है  किसी भी प्रकार की वस्तु लौटाना , , या. इसके अतिरिक्त, कार्य और  प्रकार के तर्कों की आवश्यकता है  और, क्रमश।

निम्नलिखित प्रोग्राम कोड तदर्थ बहुरूपता फ़ंक्शन को परिभाषित करता है जो सदस्य फ़ंक्शन को आमंत्रित करता है  दी गई वस्तु का. कार्यक्रम में दो प्रकार के एनोटेशन हैं, अर्थात्  और, इंटरसेक्शन टाइप कंस्ट्रक्टर के माध्यम से जुड़ा हुआ है. विशेष रूप से, जब किसी प्रकार के तर्क पर लागू किया जाता है  प्रकार का ऑब्जेक्ट लौटाता है, और जब किसी प्रकार के तर्क पर लागू किया जाता है  प्रकार का ऑब्जेक्ट लौटाता है. आदर्श रूप से, किसी भी वस्तु पर लागू नहीं होना चाहिए (संभवतः संयोग से) a  तरीका। अंत में, निम्नलिखित प्रोग्राम कोड उपरोक्त परिभाषाओं के टाइप_सेफ्टी उपयोग को प्रदर्शित करता है। उपरोक्त प्रोग्राम कोड में निम्नलिखित गुण हैं:
 * पंक्तियाँ 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$, फिर प्रत्येक पद के लिए $$N$$ प्रकार का $$\sigma$$, शब्द $$M$$ प्रकार है $$\tau[x := N]$$. इस धारणा को अंतर्निहित आश्रित प्रकार#Pi प्रकार भी कहा जाता है, उस तर्क को देखते हुए $$N$$ टर्म स्तर पर नहीं रखा गया है.