संरचनात्मक टाइप प्रणाली: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
Line 3: Line 3:
{{type systems}}
{{type systems}}


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


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


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


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


अनुमानित और गैर-अनुमानित बहुरूपता के लिए संरचनात्मक प्रतिस्थापन के बीच एक अंतर उपस्थित होता है। कुछ भाषाएँ, जैसे कि [[हास्केल (प्रोग्रामिंग भाषा)]], उस स्थिति में संरचनात्मक रूप से स्थापित नहीं करती हैं जहाँ एक अपेक्षित डेटाटाइप घोषित किया जाता है (अर्थात, अनुमानित नहीं), उदाहरण के लिए, केवल उन कार्यों के लिए स्थापित हैं जो हस्ताक्षर-आधारित बहुरूपी डेटाटाइप के अनुमान के माध्यम से प्रदर्शित होते हैं।<ref>{{cite web|title=हस्ताक्षर आधारित बहुरूपता|url=http://lambda-the-ultimate.org/node/1319#comment-14944}}</ref> तब गलती से एक गैर-अनुमानित डेटाटाइप को उप-डेटाटाइप करना संभव नहीं है, हालांकि यह अभी भी एक गैर-अनुमानित डेटाटाइप के लिए एक स्पष्ट रूपांतरण प्रदान करना संभव हो सकता है, जिसे निहित रूप से प्रयुक्त किया गया है।
अनुमानित और गैर-अनुमानित बहुरूपता के लिए संरचनात्मक प्रतिस्थापन के बीच एक अंतर उपस्थित होता है। कुछ भाषाएँ, जैसे कि [[हास्केल (प्रोग्रामिंग भाषा)]], उस स्थिति में संरचनात्मक रूप से स्थापित नहीं करती हैं जहाँ एक अपेक्षित डेटाटाइप घोषित किया जाता है (अर्थात, अनुमानित नहीं), उदाहरण के लिए, केवल उन कार्यों के लिए स्थापित हैं जो हस्ताक्षर-आधारित बहुरूपी डेटाटाइप के अनुमान के माध्यम से प्रदर्शित होते हैं।<ref>{{cite web|title=हस्ताक्षर आधारित बहुरूपता|url=http://lambda-the-ultimate.org/node/1319#comment-14944}}</ref> तब गलती से एक गैर-अनुमानित डेटाटाइप को उप-डेटाटाइप करना संभव नहीं है, हालांकि यह अभी भी एक गैर-अनुमानित डेटाटाइप के लिए एक स्पष्ट रूपांतरण प्रदान करना संभव हो सकता है जिसे निहित रूप से प्रयुक्त किया गया है।


संरचनात्मक सबटाइपिंग नॉमिनेटिव डेटाटाइप की सबटाइपिंग की तुलना में यकीनन अधिक नम्य है, क्योंकि यह [[प्रोटोकॉल (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)|प्रोटोकॉल (वस्तु-उन्मुख प्रोग्रामिंग)]] के निर्माण की स्वीकृति देता है विशेष रूप से, यह एक डेटाटाइप के निर्माण की स्वीकृति देता है जो बाद की परिभाषा को संशोधित किए बिना उपस्थित डेटाटाइप का एक उच्च डेटाटाइप है। हालाँकि, यह वांछनीय नहीं हो सकता है जहाँ प्रोग्रामर अमूर्त डेटाटाइप बनाना चाहता है।
संरचनात्मक सबटाइपिंग नॉमिनेटिव डेटाटाइप की सबटाइपिंग की तुलना में यकीनन अधिक सुगम होया है, क्योंकि यह [[प्रोटोकॉल (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)|प्रोटोकॉल (वस्तु-उन्मुख प्रोग्रामिंग)]] के निर्माण की स्वीकृति देता है विशेष रूप से, यह एक डेटाटाइप के निर्माण की स्वीकृति देता है जो बाद की परिभाषा को संशोधित किए बिना उपस्थित डेटाटाइप का एक उच्च डेटाटाइप है। हालाँकि, यह वांछनीय नहीं हो सकता है जहाँ प्रोग्रामर अमूर्त डेटाटाइप बनाना चाहता है। संरचनात्मक टाइपिंग बनाम नॉमिनेटिव टाइपिंग की एक कमी यह है कि दो अलग-अलग परिभाषित डेटाटाइप अलग-अलग उद्देश्यों के लिए अभिप्रेत हैं, लेकिन गलती से एक ही विशेषता धारण करते हैं (जैसे दोनों पूर्णांक की एक जोड़ी), डेटाटाइप प्रणाली द्वारा एक ही डेटाटाइप माना जा सकता है प्रत्येक उपयोग के लिए एक [[बीजगणितीय डेटा प्रकार|बीजगणितीय]] डेटाटाइप बनाकर केवल इसलिए वे समान संरचना के होते है। 1990 में, विकासक कुक और अन्य ने विकासकों ने सिद्ध किया कि संरचनात्मक रूप से डेटाटाइप की गई [[प्रोटोकॉल (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)|वस्तु-उन्मुख प्रोग्रामिंग]] भाषाओं में इनहेरिटेंस सबटाइपिंग नहीं होती है।<ref>{{cite journal|last1=Cook|first1=W.R.|last2=Hill|first2=W.L.|last3=Canning|first3=P.S.|title=वंशानुक्रम उपप्रकार नहीं है|journal=Proceedings of the Seventeenth Annual ACM Symposium on Principles of Programming Languages|date= January 1990|pages=125–135|doi=10.1145/96709.96721|url=http://dl.acm.org/citation.cfm?id=96721|location=San Francisco, California|isbn=978-0897913430|s2cid=8225906 |doi-access=free}}</ref>


'''संरचनात्मक टाइपिंग बनाम नाममात्र टाइपिंग''' का एक नुकसान यह है कि दो अलग-अलग परिभाषित डेटाटाइप अलग-अलग उद्देश्यों के लिए अभिप्रेत हैं, लेकिन गलती से एक ही गुण धारण करते हैं (जैसे दोनों पूर्णांक की एक जोड़ी से बना), डेटाटाइप सिस्टम द्वारा एक ही डेटाटाइप माना जा सकता है, केवल इसलिए कि वे समान संरचना होना होता है। एक तरह से इससे बचा जा सकता है प्रत्येक उपयोग के लिए एक [[बीजगणितीय डेटा प्रकार|बीजगणितीय]] डेटाटाइप बनाकर।
संरचनात्मक टाइपिंग के आधार पर यह जांचना कि दो डेटाटाइप सुसंगत हैं और एक गैर-तुच्छ संचालक डेटाटाइप है, उदाहरण के लिए, पिछले परीक्षण किए गए डेटाटाइप को स्थित रखने की आवश्यकता होती है।<ref>{{cite web|title=Type compatibility: name vs structural equivalence|url=https://shape-of-code.com/2018/05/08/type-compatibility-name-vs-structural-equivalence/}}</ref>
 
1990 में, कुक और अन्य ने साबित किया कि संरचनात्मक रूप से डेटाटाइप की गई OO भाषाओं में इनहेरिटेंस सबटाइपिंग नहीं है।<ref>{{cite journal|last1=Cook|first1=W.R.|last2=Hill|first2=W.L.|last3=Canning|first3=P.S.|title=वंशानुक्रम उपप्रकार नहीं है|journal=Proceedings of the Seventeenth Annual ACM Symposium on Principles of Programming Languages|date= January 1990|pages=125–135|doi=10.1145/96709.96721|url=http://dl.acm.org/citation.cfm?id=96721|location=San Francisco, California|isbn=978-0897913430|s2cid=8225906 |doi-access=free}}</ref>
 
संरचनात्मक टाइपिंग के आधार पर यह जांचना कि दो डेटाटाइप संगत हैं, एक गैर-तुच्छ ऑपरेशन है, उदाहरण के लिए, पिछले चेक किए गए प्रकारों के ढेर को बनाए रखने की आवश्यकता होती है।<ref>{{cite web|title=Type compatibility: name vs structural equivalence|url=https://shape-of-code.com/2018/05/08/type-compatibility-name-vs-structural-equivalence/}}</ref>
== उदाहरण ==
== उदाहरण ==
ओसीएएमएल में वस्तुओं को संरचनात्मक रूप से उनके तरीकों के नाम और डेटाटाइप से प्रदर्शित किया जाता है। वस्तुओं को नाम वर्ग के अतिरिक्त प्रत्यक्ष वस्तुओं से डिजाइन किया जा सकता है। कक्षाएं केवल वस्तुओं को बनाने के कार्यों के रूप में कार्य करती हैं।
ओसीएएमएल में वस्तुओं को संरचनात्मक रूप से उनके प्रकारों के नाम और डेटाटाइप से प्रदर्शित किया जाता है। वस्तुओं को नाम वर्ग के अतिरिक्त प्रत्यक्ष वस्तुओं से डिजाइन किया जा सकता है। <code>Datatype_classes</code> केवल वस्तुओं को बनाने के कार्यों के रूप में कार्य करती हैं।
   # let x =
   # let x =
     object
     object
Line 30: Line 26:
     end;;
     end;;
   val x : < get_x : int; set_x : int -> unit > = <obj>
   val x : < get_x : int; set_x : int -> unit > = <obj>
यहाँ ओसीएएमएल पारस्परिक रनटाइम सुविधा के लिए अनुमानित डेटाटाइप की वस्तु को <code>print</code> करता है। इसका डेटाटाइप (<code>< get_x : int; set_x : int -> unit ></code>) केवल इसके तरीकों से परिभाषित किया गया है। दूसरे शब्दों में, x के डेटाटाइप को विधि डेटाटाइप get_x : int और set_x : int -> Unit के अतिरिक्त किसी भी नाम से परिभाषित किया गया है।<ref>{{cite web|title=वस्तु प्रकार|url=http://caml.inria.fr/pub/docs/manual-ocaml/types.html}}</ref> किसी अन्य वस्तुओं को परिभाषित करने के लिए, जिसमें समान विधियाँ और डेटाटाइप के तरीके हैं:
यहाँ ओसीएएमएल पारस्परिक रनटाइम सुविधा के लिए अनुमानित डेटाटाइप की वस्तु को <code>print</code> करता है। इसका डेटाटाइप <code>< get_x : int; set_x : int -> unit ></code> केवल इसके तरीकों से परिभाषित किया गया है। दूसरे शब्दों में, x के डेटाटाइप को विधि डेटाटाइप get_x : int और set_x : int -> Unit के अतिरिक्त किसी भी नाम से परिभाषित किया गया है।<ref>{{cite web|title=वस्तु प्रकार|url=http://caml.inria.fr/pub/docs/manual-ocaml/types.html}}</ref> किसी अन्य वस्तुओं को परिभाषित करने के लिए, जिसमें समान विधियाँ और डेटाटाइप के विभिन्न तरीके हैं:
  # let y =
  # let y =
     object
     object
Line 37: Line 33:
     end;;
     end;;
   val y : < get_x : int; set_x : int -> unit > = <obj>
   val y : < get_x : int; set_x : int -> unit > = <obj>
ओसीएएमएल उन्हें एक ही डेटाटाइप का स्वीकृति करता है। उदाहरण के लिए, समतुल्य ऑपरेटर केवल एक ही डेटाटाइप के दो मान लेने के लिए डेटाटाइप किया गया है:
ओसीएएमएल उन्हें एक ही डेटाटाइप की स्वीकृति करता है। उदाहरण के लिए, समतुल्य ऑपरेटर केवल एक ही डेटाटाइप के दो मान लेने के लिए डेटाटाइप किया गया है:
  # x = y;;
  # x = y;;
   - : bool = false
   - : bool = false
ऐसी स्थिति मे वे एक ही डेटाटाइप के होने चाहिए, अन्यथा यह टाइप-परिवर्तन भी नहीं होगा। इससे यह पता चलता है कि प्रकारों की समानता संरचनात्मक है। और कोई एक फ़ंक्शन को परिभाषित कर सकता है जो एक विधि का आह्वान करता है:
ऐसी स्थिति मे वे एक ही डेटाटाइप के होने चाहिए, अन्यथा यह टाइप-परिवर्तन भी नहीं होगा। इससे यह पता चलता है कि प्रकारों की समानता संरचनात्मक है। और कोई एक फ़ंक्शन को परिभाषित कर सकता है जो एक विधि का संचालन करता है:
   # let set_to_10 a = a#set_x 10;;
   # let set_to_10 a = a#set_x 10;;
   val set_to_10 : < set_x : int -> 'a; .. > -> 'a = <fun>
   val set_to_10 : < set_x : int -> 'a; .. > -> 'a = <fun>
पहले तर्क के लिए अनुमानित डेटाटाइप (<code>< set_x : int -> 'a; .. >)</code> है। <code>..e></code> का अर्थ है कि पहला तर्क कोई भी वस्तु हो सकती है जिसमें एक <code>set_x</code>विधि हो, जो एक <code>int</code> को तर्क के रूप में प्राप्त करती है। तो यह वस्तु पर <code>x</code> के रूप मे प्रयुक्त किया जा सकता है:
पहले तर्क के लिए अनुमानित डेटाटाइप (<code>< set_x : int -> 'a; .. >)</code> है। जिसका <code>..e></code> का अर्थ है कि पहला तर्क कोई भी वस्तु हो सकती है जिसमें एक <code>set_x</code>विधि हो, जो एक <code>int</code> को तर्क के रूप में प्राप्त करती है। तो इसको वस्तु पर <code>x</code> के रूप मे प्रयुक्त किया जा सकता है:
  # set_to_10 x;;
  # set_to_10 x;;
   - : unit = ()
   - : unit = ()
एक अन्य वस्तु बनाई जा सकती है जो उस विधि और विधि डेटाटाइप के लिए होती है अन्य तरीके अप्रासंगिक होते हैं:
एक अन्य वस्तु बनाई जा सकती है जो उस विधि या डेटाटाइप के लिए होती है जिसमे अन्य तरीके अप्रासंगिक होते हैं:
   # let z =
   # let z =
     object
     object
Line 57: Line 53:
   10
   10
   - : unit = ()
   - : unit = ()
इससे यह पता चलता है कि विधि आह्वान जैसी वस्तुओ के लिए अनुकूलता संरचना द्वारा निर्धारित की जाती है। माना कि वस्तुओं के लिए केवल एक get_x विधि और कोई अन्य विधि के साथ समानार्थी शब्द को परिभाषित करती है:
इससे यह पता चलता है कि विधि संचालन जैसी वस्तुओ के लिए अनुकूलता संरचना द्वारा निर्धारित की जाती है। माना कि वस्तुओं के लिए केवल एक get_x विधि और कोई अन्य विधि के साथ समानार्थी शब्द को परिभाषित करती है:
  # type simpler_obj = < get_x : int >;;
  # type simpler_obj = < get_x : int >;;
   type simpler_obj = < get_x : int >
   type simpler_obj = < get_x : int >

Revision as of 09:07, 10 March 2023

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

विवरण

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

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

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

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

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

संरचनात्मक टाइपिंग के आधार पर यह जांचना कि दो डेटाटाइप सुसंगत हैं और एक गैर-तुच्छ संचालक डेटाटाइप है, उदाहरण के लिए, पिछले परीक्षण किए गए डेटाटाइप को स्थित रखने की आवश्यकता होती है।[3]

उदाहरण

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

 # let x =
   object
    val mutable x = 5
    method get_x = x
    method set_x y = x <- y
   end;;
 val x : < get_x : int; set_x : int -> unit > = <obj>

यहाँ ओसीएएमएल पारस्परिक रनटाइम सुविधा के लिए अनुमानित डेटाटाइप की वस्तु को print करता है। इसका डेटाटाइप < get_x : int; set_x : int -> unit > केवल इसके तरीकों से परिभाषित किया गया है। दूसरे शब्दों में, x के डेटाटाइप को विधि डेटाटाइप get_x : int और set_x : int -> Unit के अतिरिक्त किसी भी नाम से परिभाषित किया गया है।[4] किसी अन्य वस्तुओं को परिभाषित करने के लिए, जिसमें समान विधियाँ और डेटाटाइप के विभिन्न तरीके हैं:

# let y =
   object
    method get_x = 2
    method set_x y = Printf.printf "%d\n" y
   end;;
 val y : < get_x : int; set_x : int -> unit > = <obj>

ओसीएएमएल उन्हें एक ही डेटाटाइप की स्वीकृति करता है। उदाहरण के लिए, समतुल्य ऑपरेटर केवल एक ही डेटाटाइप के दो मान लेने के लिए डेटाटाइप किया गया है:

# x = y;;
 - : bool = false

ऐसी स्थिति मे वे एक ही डेटाटाइप के होने चाहिए, अन्यथा यह टाइप-परिवर्तन भी नहीं होगा। इससे यह पता चलता है कि प्रकारों की समानता संरचनात्मक है। और कोई एक फ़ंक्शन को परिभाषित कर सकता है जो एक विधि का संचालन करता है:

 # let set_to_10 a = a#set_x 10;;
 val set_to_10 : < set_x : int -> 'a; .. > -> 'a = <fun>

पहले तर्क के लिए अनुमानित डेटाटाइप (< set_x : int -> 'a; .. >) है। जिसका ..e> का अर्थ है कि पहला तर्क कोई भी वस्तु हो सकती है जिसमें एक set_xविधि हो, जो एक int को तर्क के रूप में प्राप्त करती है। तो इसको वस्तु पर x के रूप मे प्रयुक्त किया जा सकता है:

# set_to_10 x;;
 - : unit = ()

एक अन्य वस्तु बनाई जा सकती है जो उस विधि या डेटाटाइप के लिए होती है जिसमे अन्य तरीके अप्रासंगिक होते हैं:

 # let z =
   object
    method blahblah = 2.5
    method set_x y = Printf.printf "%d\n" y
   end;;
 val z : < blahblah : float; set_x : int -> unit > = <obj>

Set_to_10 फ़ंक्शन भी इस पर कार्य करता है:

# set_to_10 z;;
 10
 - : unit = ()

इससे यह पता चलता है कि विधि संचालन जैसी वस्तुओ के लिए अनुकूलता संरचना द्वारा निर्धारित की जाती है। माना कि वस्तुओं के लिए केवल एक get_x विधि और कोई अन्य विधि के साथ समानार्थी शब्द को परिभाषित करती है:

# type simpler_obj = < get_x : int >;;
 type simpler_obj = < get_x : int >

जो वस्तु x इस डेटाटाइप का नहीं है लेकिन संरचनात्मक रूप से x इस डेटाटाइप का एक उप डेटाटाइप है, चूंकि x इसके तरीकों का एक उच्च डेटाटाइप सम्मिलित है। इसलिए x इस डेटाटाइप के लिए निर्धारित किया जा सकता है:

# (x :> simpler_obj);;
 - : simpler_obj = <obj>
 # (x :> simpler_obj)#get_x;;
 - : int = 10

लेकिन ऑब्जेक्ट z नहीं, क्योंकि यह एक संरचनात्मक उप डेटाटाइप नहीं है:

# (z :> simpler_obj);;
This expression cannot be coerced to type simpler_obj = < get_x : int >;
it has type < blahblah : float; set_x : int -> unit > but is here used with type
 < get_x : int; .. >
The first object type has no method get_x

इससे यह पता चलता है कि सिंटेक्स को विस्तारित करने की अनुकूलता संरचनात्मक होती है।

संदर्भ

  1. "हस्ताक्षर आधारित बहुरूपता".
  2. Cook, W.R.; Hill, W.L.; Canning, P.S. (January 1990). "वंशानुक्रम उपप्रकार नहीं है". Proceedings of the Seventeenth Annual ACM Symposium on Principles of Programming Languages. San Francisco, California: 125–135. doi:10.1145/96709.96721. ISBN 978-0897913430. S2CID 8225906.
  3. "Type compatibility: name vs structural equivalence".
  4. "वस्तु प्रकार".


बाहरी संबंध