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

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

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

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

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

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

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

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

1990 में, कुक और अन्य ने साबित किया कि संरचनात्मक रूप से डेटाटाइप की गई OO भाषाओं में इनहेरिटेंस सबटाइपिंग नहीं है।

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

उदाहरण
ओसीएएमएल में वस्तुओं को संरचनात्मक रूप से उनके तरीकों के नाम और डेटाटाइप से प्रदर्शित किया जाता है। वस्तुओं को नाम वर्ग के अतिरिक्त प्रत्यक्ष वस्तुओं से डिजाइन किया जा सकता है। कक्षाएं केवल वस्तुओं को बनाने के कार्यों के रूप में कार्य करती हैं। # 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 > = यहाँ ओसीएएमएल पारस्परिक रनटाइम सुविधा के लिए अनुमानित डेटाटाइप की वस्तु को  करता है। इसका डेटाटाइप  केवल इसके तरीकों से परिभाषित किया गया है। दूसरे शब्दों में, x के डेटाटाइप को विधि डेटाटाइप get_x : int और set_x : int -> Unit के अतिरिक्त किसी भी नाम से परिभाषित किया गया है। किसी अन्य वस्तुओं को परिभाषित करने के लिए, जिसमें समान विधियाँ और डेटाटाइप के तरीके हैं: object method get_x = 2 method set_x y = Printf.printf "%d\n" y   end;; val y : < get_x : int; set_x : int -> unit > = ओसीएएमएल उन्हें एक ही डेटाटाइप का स्वीकृति करता है। उदाहरण के लिए, समतुल्य ऑपरेटर केवल एक ही डेटाटाइप के दो मान लेने के लिए डेटाटाइप किया गया है: - : bool = false ऐसी स्थिति मे वे एक ही डेटाटाइप के होने चाहिए, अन्यथा यह टाइप-परिवर्तन भी नहीं होगा। इससे यह पता चलता है कि प्रकारों की समानता संरचनात्मक है। और कोई एक फ़ंक्शन को परिभाषित कर सकता है जो एक विधि का आह्वान करता है: # let set_to_10 a = a#set_x 10;; val set_to_10 : < set_x : int -> 'a; .. > -> 'a = पहले तर्क के लिए अनुमानित डेटाटाइप ( है।   का अर्थ है कि पहला तर्क कोई भी वस्तु हो सकती है जिसमें एक  विधि हो, जो एक   को तर्क के रूप में प्राप्त करती है। तो यह वस्तु पर   के रूप मे प्रयुक्त किया जा सकता है:  - : 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 > = Set_to_10 फ़ंक्शन भी इस पर कार्य करता है:   10  - : unit =  इससे यह पता चलता है कि विधि आह्वान जैसी वस्तुओ के लिए अनुकूलता संरचना द्वारा निर्धारित की जाती है। माना कि वस्तुओं के लिए केवल एक get_x विधि और कोई अन्य विधि के साथ समानार्थी शब्द को परिभाषित करती है:  type simpler_obj = < get_x : int > जो वस्तु   इस डेटाटाइप का नहीं है लेकिन संरचनात्मक रूप से   इस डेटाटाइप का एक उप डेटाटाइप है, चूंकि   इसके तरीकों का एक उच्च डेटाटाइप सम्मिलित है। इसलिए   इस डेटाटाइप के लिए निर्धारित किया जा सकता है: - : simpler_obj = # (x :> simpler_obj)#get_x;; - : int = 10 लेकिन ऑब्जेक्ट  नहीं, क्योंकि यह एक संरचनात्मक उप डेटाटाइप नहीं है: 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) let y =
 * 1) x = y;;
 * 1) set_to_10 x;;
 * 1) set_to_10 z;;
 * 1) type simpler_obj = < get_x : int >;;
 * 1) (x :> simpler_obj);;
 * 1) (z :> simpler_obj);;

बाहरी संबंध

 * NominativeAndStructuralTyping at WikiWikiWeb