संरचनात्मक टाइप प्रणाली: Difference between revisions
(Created page with "{{Short description|Class of type systems}} {{refimprove|date=July 2011}} {{type systems}} एक संरचनात्मक प्रकार प्रणाली (य...") |
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> तब गलती से एक गैर-अनुमानित डेटाटाइप को उप-डेटाटाइप करना संभव नहीं है, हालांकि यह अभी भी एक गैर-अनुमानित डेटाटाइप के लिए एक स्पष्ट रूपांतरण प्रदान करना संभव हो सकता है, जिसे निहित रूप से प्रयुक्त किया गया है। | ||
संरचनात्मक सबटाइपिंग नॉमिनेटिव डेटाटाइप की सबटाइपिंग की तुलना में यकीनन अधिक नम्य है, क्योंकि यह [[प्रोटोकॉल (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग)|प्रोटोकॉल (वस्तु-उन्मुख प्रोग्रामिंग)]] के निर्माण की स्वीकृति देता है विशेष रूप से, यह एक डेटाटाइप के निर्माण की स्वीकृति देता है जो बाद की परिभाषा को संशोधित किए बिना उपस्थित डेटाटाइप का एक उच्च डेटाटाइप है। हालाँकि, यह वांछनीय नहीं हो सकता है जहाँ प्रोग्रामर अमूर्त डेटाटाइप बनाना चाहता है। | |||
संरचनात्मक टाइपिंग बनाम नाममात्र टाइपिंग का एक नुकसान यह है कि दो अलग-अलग परिभाषित | '''संरचनात्मक टाइपिंग बनाम नाममात्र टाइपिंग''' का एक नुकसान यह है कि दो अलग-अलग परिभाषित डेटाटाइप अलग-अलग उद्देश्यों के लिए अभिप्रेत हैं, लेकिन गलती से एक ही गुण धारण करते हैं (जैसे दोनों पूर्णांक की एक जोड़ी से बना), डेटाटाइप सिस्टम द्वारा एक ही डेटाटाइप माना जा सकता है, केवल इसलिए कि वे समान संरचना होना होता है। एक तरह से इससे बचा जा सकता है प्रत्येक उपयोग के लिए एक [[बीजगणितीय डेटा प्रकार|बीजगणितीय]] डेटाटाइप बनाकर। | ||
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> | |||
== उदाहरण == | == उदाहरण == | ||
ओसीएएमएल में वस्तुओं को संरचनात्मक रूप से उनके तरीकों के नाम और डेटाटाइप से प्रदर्शित किया जाता है। वस्तुओं को नाम वर्ग के अतिरिक्त प्रत्यक्ष वस्तुओं से डिजाइन किया जा सकता है। कक्षाएं केवल वस्तुओं को बनाने के कार्यों के रूप में कार्य करती हैं। | |||
# 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> | |||
यहाँ ओसीएएमएल पारस्परिक रनटाइम सुविधा के लिए अनुमानित डेटाटाइप की वस्तु को <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 = | |||
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> | |||
पहले तर्क के लिए अनुमानित डेटाटाइप (<code>< set_x : int -> 'a; .. >)</code> है। <code>..e></code> का अर्थ है कि पहला तर्क कोई भी वस्तु हो सकती है जिसमें एक <code>set_x</code>विधि हो, जो एक <code>int</code> को तर्क के रूप में प्राप्त करती है। तो यह वस्तु पर <code>x</code> के रूप मे प्रयुक्त किया जा सकता है: | |||
# 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 > | |||
# | जो वस्तु <code>x</code> इस डेटाटाइप का नहीं है लेकिन संरचनात्मक रूप से <code>x</code> इस डेटाटाइप का एक उप डेटाटाइप है, चूंकि <code>x</code> इसके तरीकों का एक उच्च डेटाटाइप सम्मिलित है। इसलिए <code>x</code> इस डेटाटाइप के लिए निर्धारित किया जा सकता है: | ||
# (x :> simpler_obj);; | |||
- : simpler_obj = <obj> | |||
# (x :> simpler_obj)#get_x;; | |||
एक अन्य वस्तु बनाई जा सकती है जो उस विधि और विधि | - : int = 10 | ||
लेकिन ऑब्जेक्ट <code>z</code> नहीं, क्योंकि यह एक संरचनात्मक उप डेटाटाइप नहीं है: | |||
# (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 | |||
इससे यह पता चलता है कि सिंटेक्स को विस्तारित करने की अनुकूलता संरचनात्मक होती है। | |||
Set_to_10 फ़ंक्शन भी इस पर | |||
# | |||
इससे पता चलता है कि | |||
# | |||
जो वस्तु <code>x</code> इस | |||
# ( | |||
लेकिन | |||
# ( | |||
इससे पता चलता है कि | |||
== संदर्भ == | == संदर्भ == |
Revision as of 21:38, 9 March 2023
This article needs additional citations for verification. (July 2011) (Learn how and when to remove this template message) |
Type systems |
---|
General concepts |
Major categories |
|
Minor categories |
संरचनात्मक टाइप प्रणाली या संपत्ति (प्रॉपर्टी) आधारित डेटा-टाइप प्रणाली, डेटाटाइप प्रणालियों का एक प्रमुख वर्ग है जिसमें डेटाटाइप की संगतता और समानता डेटाटाइप की वास्तविक संरचना या परिभाषा द्वारा निर्धारित की जाती है अन्य विशेषताओं जैसे कि इसका नाम या घोषणा की संरचनात्मक प्रणालियों का उपयोग यह निर्धारित करने के लिए किया जाता है कि क्या डेटाटाइप समतुल्य हैं और क्या एक डेटाटाइप दूसरे का उप-डेटाटाइप है। या नॉमिनेटिव डेटाटाइप प्रणाली के विपरीत है जहां पर तुलना डेटाटाइप या स्पष्ट घोषणाओं के नाम पर आधारित होती है और टाइपिंग, जिसमें रनटाइम पर अभिगम्य होने वाली संरचना का केवल एक भाग संगतता के लिए नियंत्रित किया जाता है।
विवरण
संरचनात्मक टाइपिंग में, एक वेरिएबल को दूसरे के साथ संगत माना जाता है यदि दूसरे वेरिएबल के डेटाटाइप के भीतर प्रत्येक सुविधा के लिए पहले वेरिएबल के डेटाटाइप में एक समान और समान विशेषता सम्मिलित होती है। तब विवरण पर कुछ भाषाएँ भिन्न हो सकती हैं, जैसे कि सुविधाओं को नाम से अनुरूप होना चाहिए या नहीं यह परिभाषा सममित नहीं होती है और इसमें उप-डेटाटाइप संगतता सम्मिलित है। यदि प्रत्येक दूसरे के साथ संगत है तो दो डेटाटाइप को समान माना जाता है।
उदाहरण के लिए, ओसीएएमएल ऑब्जेक्ट (वस्तु) डेटाटाइप की अनुकूलता के लिए विधियों पर संरचनात्मक टाइपिंग का उपयोग किया जाता है। गो (प्रोग्रामिंग भाषा) इंटरफ़ेस के साथ एक डेटाटाइप की संगतता निर्धारित करने के तरीकों पर संरचनात्मक टाइपिंग का उपयोग किया जाता है। सी ++ टेम्पलेट फ़ंक्शंस डेटाटाइप तर्कों पर संरचनात्मक टाइपिंग प्रदर्शित करते हैं। जो हैक्स संरचनात्मक टाइपिंग का उपयोग करता है, लेकिन कक्षाएं संरचनात्मक रूप से उप-डेटाटाइप नहीं होती हैं।
उप-डेटाटाइप बहुरूपता का समर्थन करने वाली भाषाओं में, उप-डेटाटाइप संबंध को कैसे परिभाषित किया जाता है, इसके आधार पर एक समान द्विभाजन बनाया जा सकता है। एक डेटाटाइप दूसरे का उप-डेटाटाइप है यदि इसमें आधार डेटाटाइप की सभी विशेषताएं सम्मिलित हैं या इसके उप-डेटाटाइप हैं। जैसे सदस्य आधार डेटाटाइप या अपरिवर्तनीय डेटाटाइप सम्मिलित नही हैं। उप-डेटाटाइप में अतिरिक्त विशेषताएं हो सकती हैं।
अनुमानित और गैर-अनुमानित बहुरूपता के लिए संरचनात्मक प्रतिस्थापन के बीच एक अंतर उपस्थित होता है। कुछ भाषाएँ, जैसे कि हास्केल (प्रोग्रामिंग भाषा), उस स्थिति में संरचनात्मक रूप से स्थापित नहीं करती हैं जहाँ एक अपेक्षित डेटाटाइप घोषित किया जाता है (अर्थात, अनुमानित नहीं), उदाहरण के लिए, केवल उन कार्यों के लिए स्थापित हैं जो हस्ताक्षर-आधारित बहुरूपी डेटाटाइप के अनुमान के माध्यम से प्रदर्शित होते हैं।[1] तब गलती से एक गैर-अनुमानित डेटाटाइप को उप-डेटाटाइप करना संभव नहीं है, हालांकि यह अभी भी एक गैर-अनुमानित डेटाटाइप के लिए एक स्पष्ट रूपांतरण प्रदान करना संभव हो सकता है, जिसे निहित रूप से प्रयुक्त किया गया है।
संरचनात्मक सबटाइपिंग नॉमिनेटिव डेटाटाइप की सबटाइपिंग की तुलना में यकीनन अधिक नम्य है, क्योंकि यह प्रोटोकॉल (वस्तु-उन्मुख प्रोग्रामिंग) के निर्माण की स्वीकृति देता है विशेष रूप से, यह एक डेटाटाइप के निर्माण की स्वीकृति देता है जो बाद की परिभाषा को संशोधित किए बिना उपस्थित डेटाटाइप का एक उच्च डेटाटाइप है। हालाँकि, यह वांछनीय नहीं हो सकता है जहाँ प्रोग्रामर अमूर्त डेटाटाइप बनाना चाहता है।
संरचनात्मक टाइपिंग बनाम नाममात्र टाइपिंग का एक नुकसान यह है कि दो अलग-अलग परिभाषित डेटाटाइप अलग-अलग उद्देश्यों के लिए अभिप्रेत हैं, लेकिन गलती से एक ही गुण धारण करते हैं (जैसे दोनों पूर्णांक की एक जोड़ी से बना), डेटाटाइप सिस्टम द्वारा एक ही डेटाटाइप माना जा सकता है, केवल इसलिए कि वे समान संरचना होना होता है। एक तरह से इससे बचा जा सकता है प्रत्येक उपयोग के लिए एक बीजगणितीय डेटाटाइप बनाकर।
1990 में, कुक और अन्य ने साबित किया कि संरचनात्मक रूप से डेटाटाइप की गई OO भाषाओं में इनहेरिटेंस सबटाइपिंग नहीं है।[2]
संरचनात्मक टाइपिंग के आधार पर यह जांचना कि दो डेटाटाइप संगत हैं, एक गैर-तुच्छ ऑपरेशन है, उदाहरण के लिए, पिछले चेक किए गए प्रकारों के ढेर को बनाए रखने की आवश्यकता होती है।[3]
उदाहरण
ओसीएएमएल में वस्तुओं को संरचनात्मक रूप से उनके तरीकों के नाम और डेटाटाइप से प्रदर्शित किया जाता है। वस्तुओं को नाम वर्ग के अतिरिक्त प्रत्यक्ष वस्तुओं से डिजाइन किया जा सकता है। कक्षाएं केवल वस्तुओं को बनाने के कार्यों के रूप में कार्य करती हैं।
# 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
इससे यह पता चलता है कि सिंटेक्स को विस्तारित करने की अनुकूलता संरचनात्मक होती है।
संदर्भ
- ↑ "हस्ताक्षर आधारित बहुरूपता".
- ↑ 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.
- ↑ "Type compatibility: name vs structural equivalence".
- ↑ "वस्तु प्रकार".
- Pierce, Benjamin C. (2002). "19.3". Types and Programming Languages. MIT Press. ISBN 978-0-262-16209-8.