प्रकार (प्ररूप सिद्धांत): Difference between revisions

From Vigyanwiki
(Created page with "{{Short description|Type of types in a type system}} गणितीय तर्क और कंप्यूटर विज्ञान के क्षेत्र...")
 
No edit summary
Line 1: Line 1:
{{Short description|Type of types in a type system}}
[[गणितीय तर्क]] और [[कंप्यूटर विज्ञान]] के क्षेत्र में जिसे [[ प्रकार सिद्धांत |प्ररूप सिद्धांत]] के रूप में जाना जाता है, एक '''प्रकार''' प्ररूप के निर्माता का प्रकार होता है या, प्रायः, उच्च-क्रम प्रकार के ऑपरेटर का प्रकार होता है। एक प्रकार की प्रणाली अनिवार्य रूप से सरल रूप से टाइप किया गया लैम्ब्डा गणना "एक स्तर ऊपर" है, जो एक साधारण प्रकार से संपन्न है, जिसे <math>*</math> दर्शाया जाता है और "प्रकार" कहा जाता है, जो कि किसी भी [[डेटा प्रकार]] का प्रकार है जिसे किसी भी प्रकार के [[पैरामीट्रिक बहुरूपता|पैरामीटरों]] की आवश्यकता नहीं होती है।  
[[गणितीय तर्क]] और [[कंप्यूटर विज्ञान]] के क्षेत्र में जिसे [[ प्रकार सिद्धांत ]] के रूप में जाना जाता है, एक प्रकार एक प्रकार के कंस्ट्रक्टर का प्रकार होता है या, कम सामान्यतः, एक उच्च-क्रम प्रकार के ऑपरेटर का प्रकार होता है। एक प्रकार की प्रणाली अनिवार्य रूप से एक स्तर ऊपर टाइप किया गया लैम्ब्डा कैलकुलस है, जो एक आदिम प्रकार से संपन्न है, जिसे दर्शाया गया है <math>*</math> और इसे प्रकार कहा जाता है, जो किसी भी [[डेटा प्रकार]] का प्रकार है जिसे किसी [[पैरामीट्रिक बहुरूपता]] की आवश्यकता नहीं होती है।
 
एक प्रकार को कभी-कभी भ्रामक रूप से डेटा प्रकार|(डेटा) प्रकार के प्रकार के रूप में वर्णित किया जाता है, लेकिन यह वास्तव में एक एरिटी विनिर्देशक के रूप में अधिक है। वाक्यात्मक रूप से, बहुरूपी प्रकारों को प्रकार का निर्माणकर्ता मानना ​​स्वाभाविक है, इस प्रकार गैर-बहुरूपी प्रकारों को [[अशक्त]] प्रकार का रचनाकार माना जाता है। लेकिन सभी अशक्त रचनाकारों, इस प्रकार सभी मोनोमोर्फिक प्रकारों का एक ही, सरलतम प्रकार होता है; अर्थात् <math>*</math>.
 
चूँकि [[प्रोग्रामिंग भाषा]]ओं में उच्च-क्रम प्रकार के ऑपरेटर असामान्य हैं, अधिकांश प्रोग्रामिंग अभ्यास में, प्रकार का उपयोग डेटा प्रकारों और कंस्ट्रक्टर के प्रकारों के बीच अंतर करने के लिए किया जाता है, जिनका उपयोग पैरामीट्रिक बहुरूपता को लागू करने के लिए किया जाता है। प्रकार, स्पष्ट रूप से या परोक्ष रूप से, उन भाषाओं में प्रकट होते हैं जिनके प्रकार सिस्टम प्रोग्रामेटिक रूप से सुलभ तरीके से पैरामीट्रिक बहुरूपता के लिए जिम्मेदार होते हैं, जैसे कि [[C++]],<ref>{{Cite web|title=CS 115: Parametric Polymorphism: Template Functions|url=http://www2.cs.uregina.ca/~saxton/CS115/Notes/Templates/func.html|access-date=2020-08-06|website=www2.cs.uregina.ca}}</ref> [[हास्केल (प्रोग्रामिंग भाषा)]] और [[स्काला (प्रोग्रामिंग भाषा)]]<!-- have to check Scala, but I bet it allows parametric polymorphism -->.<ref name="higherkinds">{{Cite web |url=http://adriaanm.github.com/files/higher.pdf |title=उच्च प्रकार के जेनेरिक|access-date=2012-06-10 |archive-date=2012-06-10 |archive-url=https://web.archive.org/web/20120610022753/http://adriaanm.github.com/files/higher.pdf |url-status=dead }}</ref>


प्रकार को कभी-कभी भ्रामक रूप से "(डेटा) प्रकार के प्रकार" के रूप में वर्णित किया जाता है, लेकिन यह वास्तव में योग्यता विनिर्देशक के रूप में अधिक है। वाक्यात्मक रूप से, बहुरूपी प्रकारों को प्रकार का निर्माणकर्ता मानना स्वाभाविक है, इस प्रकार गैर-बहुरूपी प्रकारों को अशक्त प्रकार का निर्माता माना जाता है। लेकिन सभी [[अशक्त]] निर्माताओं, इस प्रकार सभी एकरूपी प्रकारों का एक ही, सरलतम प्रकार होता है अर्थात् <math>*</math>।


चूँकि उच्च-क्रम प्रकार के ऑपरेटर [[प्रोग्रामिंग भाषा|प्रोग्रामिंग भाषाओं]] में असामान्य हैं, अधिकांश प्रोग्रामिंग अभ्यास में, डेटा प्रकारों और निर्माताओं के प्रकारों के बीच अंतर करने के लिए प्रकारों का उपयोग किया जाता है, जिनका उपयोग पैरामीट्रिक बहुरूपता को लागू करने के लिए किया जाता है। प्रकार, स्पष्ट रूप से या परोक्ष रूप से, उन भाषाओं में दिखाई देते हैं जिनके प्रकार प्रणाली कार्यक्रमात्मक रूप से सुलभ तरीके से पैरामीट्रिक बहुरूपता के लिए जिम्मेदार होते हैं, जैसे [[C++|सी ++]],<ref>{{Cite web|title=CS 115: Parametric Polymorphism: Template Functions|url=http://www2.cs.uregina.ca/~saxton/CS115/Notes/Templates/func.html|access-date=2020-08-06|website=www2.cs.uregina.ca}}</ref> [[हास्केल (प्रोग्रामिंग भाषा)|हास्केल]] और [[स्काला (प्रोग्रामिंग भाषा)|स्काला]]।<ref name="higherkinds">{{Cite web |url=http://adriaanm.github.com/files/higher.pdf |title=उच्च प्रकार के जेनेरिक|access-date=2012-06-10 |archive-date=2012-06-10 |archive-url=https://web.archive.org/web/20120610022753/http://adriaanm.github.com/files/higher.pdf |url-status=dead }}</ref>
== उदाहरण ==
== उदाहरण ==


* <math>*</math>, उच्चारित प्रकार , सभी डेटा प्रकारों का एक प्रकार है जिसे अशक्त प्रकार के कंस्ट्रक्टर के रूप में देखा जाता है, और इस संदर्भ में इसे उचित प्रकार भी कहा जाता है। इसमें सामान्यतः [[कार्यात्मक प्रोग्रामिंग भाषा]]ओं में फ़ंक्शन प्रकार शामिल होते हैं।
* <math>*</math>, उच्चारित "प्रकार", सभी डेटा प्रकारों का एक प्रकार है जिसे अशक्त प्रकार के निर्माताओं के रूप में देखा जाता है, और इस संदर्भ में इसे उचित प्रकार भी कहा जाता है। इसमें सामान्यतः कार्यात्मक प्रोग्रामिंग भाषाओं में फलन प्रकार सम्मिलित होते हैं।
* <math>* \rightarrow *</math> एक [[एकात्मक कार्य]] प्रकार का कंस्ट्रक्टर है, उदाहरण के लिए एक [[सूची प्रकार]] के कंस्ट्रक्टर का।
*<math>* \rightarrow *</math> [[एकात्मक कार्य|एकल]] प्रकार का निर्माता है, जैसे एक [[सूची प्रकार]] के निर्माता का।
* <math>* \rightarrow * \rightarrow *</math> एक विक्षनरी का प्रकार है: बाइनरी प्रकार का कंस्ट्रक्टर ([[करी]]इंग के माध्यम से), उदाहरण के लिए एक [[जोड़ी प्रकार]] के कंस्ट्रक्टर का, और एक [[फ़ंक्शन प्रकार]] के कंस्ट्रक्टर का भी (इसके अनुप्रयोग के परिणाम के साथ भ्रमित न हों, जो स्वयं एक फ़ंक्शन प्रकार है, इस प्रकार <math>*</math>)
*<math>* \rightarrow * \rightarrow *</math> एक प्रकार का बाइनरी प्रकार का निर्माता है ([[करी|विच्छेदन]] के माध्यम से), जैसे एक [[जोड़ी प्रकार]] के निर्माता का, और [[फ़ंक्शन प्रकार|फलन प्रकार]] के निर्माता (इसके अनुप्रयोग के परिणाम से भ्रमित न हों, जो स्वयं फलन प्रकार है, इस प्रकार <math>*</math>) का भी।
* <math>(* \rightarrow *) \rightarrow *</math> यूनरी प्रकार के कंस्ट्रक्टर से उचित प्रकार तक एक उच्च-क्रम प्रकार का ऑपरेटर है।<ref> Pierce (2002), chapter 32</ref>
*<math>(* \rightarrow *) \rightarrow *</math> एकल प्रकार निर्माता से उचित प्रकार तक का उच्च-क्रम प्रकार का ऑपरेटर है।<ref> Pierce (2002), chapter 32</ref>
 
 
== हास्केल में प्रकार ==
== हास्केल में प्रकार ==
(नोट: हास्केल दस्तावेज़ फ़ंक्शन प्रकार और प्रकार दोनों के लिए एक ही तीर का उपयोग करता है।)
(''नोट''- हास्केल दस्तावेज़ीकरण फलन प्रकार और प्रकार दोनों के लिए एक ही तीर का उपयोग करता है।)


हास्केल की प्रकार प्रणाली (प्रोग्रामिंग भाषा)<ref name="haskell98">[http://www.haskell.org/onlinereport/decls.html#sect4.1.1 Kinds - The Haskell 98 Report]</ref> बिल्कुल दो प्रकार शामिल हैं:<!--does this mean it prohibits higher order type operators? I can't tell from the report. --><!-- To clarify for the previous commentator: the type system of Haskell 2010 _does indeed_ prohibit higher-kinded types; however, the major compiler/platform (GHC, specifically) includes support for higher-kinded types through the RankNTypes language extension. -->
हास्केल 98 की प्रकार प्रणाली<ref name="haskell98">[http://www.haskell.org/onlinereport/decls.html#sect4.1.1 Kinds - The Haskell 98 Report]</ref> में बिल्कुल दो प्रकार सम्मिलित हैं-
*<math>*</math>, उच्चारित प्रकार सभी डेटा प्रकारों का प्रकार है।
*<math>*</math>, उच्चारित "प्रकार" सभी डेटा प्रकारों का प्रकार है।
*<math>k_1 \rightarrow k_2</math> एक यूनरी फ़ंक्शन प्रकार का कंस्ट्रक्टर है, जो एक प्रकार का प्रकार लेता है <math>k_1</math> और एक प्रकार का उत्पादन करता है <math>k_2</math>.
*<math>k_1 \rightarrow k_2</math> एक प्रकार का एकल प्रकार का निर्माता है, जो प्रकार का <math>k_1</math> लेता है और एक प्रकार का प्रकार <math>k_2</math> उत्पन्न करता है।


एक निवास प्रकार (जैसा कि हास्केल में उचित प्रकार कहा जाता है) एक ऐसा प्रकार है जिसमें मूल्य होते हैं। उदाहरण के लिए, चित्र को जटिल बनाने वाले [[प्रकार वर्ग]]ों को अनदेखा करना, <code>4</code> प्रकार का मान है <code>Int</code>, जबकि <code>[1, 2, 3]</code> प्रकार का मान है <code>[Int]</code> (इंट्स की सूची)इसलिए, <code>Int</code> और <code>[Int]</code> दयालु हो <math>*</math>, लेकिन उदाहरण के लिए, कोई भी फ़ंक्शन प्रकार भी ऐसा ही करता है <code>Int -> Bool</code> या और भी <code>Int -> Int -> Bool</code>.
निवासित प्रकार (जैसा कि उचित प्रकार को हास्केल में कहा जाता है) एक ऐसा प्रकार है जिसमें मान होते हैं। उदाहरण के लिए, चित्र को संवलित बनाने वाले [[प्रकार वर्ग|प्रकार वर्गों]] को अनदेखा करते हुए, <code>4</code> प्रकार <code>Int</code> का मान है, जबकि <code>[1, 2, 3]</code> प्रकार <code>[Int]</code> (Ints की सूची) का मान है। इसलिए, <code>Int</code> और <code>[Int]</code> में प्रकार <math>*</math> होता है, लेकिन किसी भी फलन प्रकार में भी ऐसा ही होता है, उदाहरण के लिए <code>Int -> Bool</code> या यहां तक कि <code>Int -> Int -> Bool</code>


एक टाइप कंस्ट्रक्टर एक या अधिक प्रकार के तर्क लेता है, और पर्याप्त तर्क दिए जाने पर एक डेटा प्रकार तैयार करता है, यानी यह करीइंग के लिए आंशिक एप्लिकेशन का समर्थन करता है।<ref name="haskell-2010">{{cite web|title=Chapter 4 Declarations and Binding|url=http://www.haskell.org/onlinereport/haskell2010/haskellch4.html#x10-65017x3|work=Haskell 2010 Language Report|access-date=23 July 2012}}</ref><ref>{{cite web|last=Miran|first=Lipovača|title=महान भलाई के लिए हास्केल सीखें!|url=http://learnyouahaskell.com/making-our-own-types-and-typeclasses|work=Making Our Own Types and Typeclasses|access-date=23 July 2012}}</ref> इस प्रकार हास्केल पैरामीट्रिक प्रकार प्राप्त करता है। उदाहरण के लिए, प्रकार <code>[]</code> (सूची) एक प्रकार का कंस्ट्रक्टर है - यह सूची के तत्वों के प्रकार को निर्दिष्ट करने के लिए एक एकल तर्क लेता है। इस तरह, <code>[Int]</code> (इंट्स की सूची), <code>[Float]</code> (फ्लोट्स की सूची) और यहां तक ​​कि <code>[&#91;Int&#93;]</code> (इंट्स की सूचियों की सूची) के वैध अनुप्रयोग हैं <code>[]</code> कंस्ट्रक्टर टाइप करें। इसलिए, <code>[]</code> एक प्रकार का प्रकार है <math>* \rightarrow *</math>. क्योंकि <code>Int</code> दयालु है <math>*</math>, आवेदन करना <code>[]</code> इसका परिणाम यह होता है <code>[Int]</code>, प्रकार का <math>*</math>. 2-[[ टपल ]] कंस्ट्रक्टर <code>(,)</code> दयालु है <math>* \rightarrow * \rightarrow *</math>, 3-ट्यूपल कंस्ट्रक्टर <code>(,,)</code> दयालु है <math>* \rightarrow * \rightarrow * \rightarrow *</math> और इसी तरह।
एक प्रकार का निर्माता एक या अधिक प्रकार के तर्क लेता है, और पर्याप्त तर्क प्रदान किए जाने पर डेटा प्रकार उत्पन्न करता है, अर्थात यह विच्छेदन के लिए आंशिक एप्लिकेशन का समर्थन करता है।<ref name="haskell-2010">{{cite web|title=Chapter 4 Declarations and Binding|url=http://www.haskell.org/onlinereport/haskell2010/haskellch4.html#x10-65017x3|work=Haskell 2010 Language Report|access-date=23 July 2012}}</ref><ref>{{cite web|last=Miran|first=Lipovača|title=महान भलाई के लिए हास्केल सीखें!|url=http://learnyouahaskell.com/making-our-own-types-and-typeclasses|work=Making Our Own Types and Typeclasses|access-date=23 July 2012}}</ref> इस प्रकार हास्केल पैरामीट्रिक प्रकार प्राप्त करता है। उदाहरण के लिए, प्रकार <code>[]</code> (सूची) एक प्रकार का निर्माता है - यह सूची के तत्वों के प्रकार को निर्दिष्ट करने के लिए एकल तर्क लेता है। इसलिए, <code>[Int]</code> (Ints की सूची), <code>[Float]</code> (फ्लोट्स की सूची) और यहां तक कि <code>[[इंट|[&#91;Int&#93;<nowiki>]</nowiki>]]</code> (Ints की सूचियों की सूची) <code>[]</code> प्रकार के निर्माता के वैध एप्लिकेशन हैं। इसलिए, <code>[]</code> प्रकार का <math>* \rightarrow *</math> है। क्योंकि <code>Int</code> में प्रकार <math>*</math> है, इसलिए इसमें <code>[]</code> लगाने से परिणाम <math>*</math> प्रकार में <code>[Int]</code> होता है। 2-[[ टपल |टपल]] निर्माता <code>(,)</code> में प्रकार <math>* \rightarrow * \rightarrow *</math> होता है, 3-टपल निर्माता <code>(,,)</code> में प्रकार <math>* \rightarrow * \rightarrow * \rightarrow *</math> होता है और इसी तरह।
<!-- needs rewriting to say what it really wants to  say, that is how kind inference is performed, but note that no kind polymorphism is allowed, so it's not quite the same.
=== प्रकार अनुमान ===
The way kinds govern types is analogous to the way types govern values. If an expression <math>f</math> has type <math>t_1 \to t_2</math> (that is, it is a function which accepts a type <math>t_1</math> and produces a type <math>t_2</math>), and <math>x</math> has type <math>t_1</math>, then the result of the function application <math>f \ x</math> has type <math>t_2</math>. Similarly if an expression <math>t_1</math> has kind <math>k_1 \rightarrow k_2</math>, and type <math>t_2</math> has kind <math>k_1</math>, then the result of the type application <math>t_1 \ t_2</math> has kind <math>k_2</math>. -->


 
मानक हास्केल [[बहुरूपी प्रकार|बहुरूपी प्रकारों]] की अनुमति नहीं देता है। यह प्रकारों पर पैरामीट्रिक बहुरूपता के विपरीत है, जो हास्केल में समर्थित है। उदाहरण के लिए, निम्नलिखित उदाहरण में-
=== प्रकार का अनुमान ===
 
मानक हास्केल [[बहुरूपी प्रकार]]ों की अनुमति नहीं देता है। यह प्रकारों पर पैरामीट्रिक बहुरूपता के विपरीत है, जो हास्केल में समर्थित है। उदाहरण के लिए, निम्नलिखित उदाहरण में:


<syntaxhighlight lang=haskell>
<syntaxhighlight lang=haskell>
data Tree z  = Leaf | Fork (Tree z) (Tree z)
data Tree z  = Leaf | Fork (Tree z) (Tree z)
</syntaxhighlight>
</syntaxhighlight>
एक प्रकार का <code>z</code> सहित कुछ भी हो सकता है <math>*</math>, लेकिन <math>* \rightarrow *</math> आदि। हास्केल डिफ़ॉल्ट रूप से हमेशा प्रकार का अनुमान लगाएगा <math>*</math>, जब तक कि प्रकार स्पष्ट रूप से अन्यथा इंगित न करे (नीचे देखें)। इसलिए टाइप चेकर निम्नलिखित उपयोग को अस्वीकार कर देगा <code>Tree</code>:
<code>z</code> का प्रकार कुछ भी हो सकता है, जिसमें <math>*</math>, लेकिन <math>* \rightarrow *</math> आदि भी सम्मिलित हैं। डिफ़ॉल्ट रूप से हास्केल हमेशा <math>*</math> प्रकार का अनुमान लगाएगा, जब तक कि प्रकार स्पष्ट रूप से अन्यथा इंगित न करे (नीचे देखें)। इसलिए प्रकार जांचकर्ता <code>Tree</code> के निम्नलिखित उपयोग को अस्वीकार कर देगा-
<syntaxhighlight lang=haskell>
<syntaxhighlight lang=haskell>
type FunnyTree = Tree []    -- invalid
type FunnyTree = Tree []    -- invalid
</syntaxhighlight>
</syntaxhighlight>
क्योंकि जिस तरह का <code>[]</code>, <math>* \rightarrow *</math> के लिए अपेक्षित प्रकार से मेल नहीं खाता <code>z</code>, जो सदैव है <math>*</math>.
क्योंकि <code>[]</code>, <math>* \rightarrow *</math> का प्रकार <code>z</code> के लिए अपेक्षित प्रकार से मेल नहीं खाता है, जो सदैव <math>*</math> होता है।


हालाँकि उच्च-क्रम प्रकार के ऑपरेटरों को अनुमति है। उदाहरण के लिए:
हालाँकि उच्च-क्रम प्रकार के ऑपरेटरों को अनुमति है। उदाहरण के लिए-


<syntaxhighlight lang=haskell>
<syntaxhighlight lang=haskell>
data App unt z = Z (unt z)
data App unt z = Z (unt z)
</syntaxhighlight>
</syntaxhighlight>
दयालु है <math>(* \rightarrow *) \rightarrow * \rightarrow *</math>, अर्थात। <code>unt</code> एक यूनरी डेटा कंस्ट्रक्टर होने की उम्मीद है, जो इसके तर्क पर लागू होता है, जो एक प्रकार होना चाहिए, और एक अन्य प्रकार लौटाता है।
प्रकार <math>(* \rightarrow *) \rightarrow * \rightarrow *</math> है, अर्थात <code>unt</code> से एकल डेटा निर्माता होने की आशा है, जो इसके तर्क पर लागू होता है, जो प्रकार होना चाहिए, और एक अन्य प्रकार वापस करता है।


[[ग्लासगो हास्केल कंपाइलर]] का विस्तार है <code>PolyKinds</code>, जो, साथ में <code>KindSignatures</code>, बहुरूपी प्रकारों की अनुमति देता है। उदाहरण के लिए:
[[ग्लासगो हास्केल कंपाइलर|जीएचसी (GHC)]] का एक्सटेंशन <code>PolyKinds</code> है, जो <code>KindSignatures</code> के साथ मिलकर बहुरूपी प्रकारों की अनुमति देता है। उदाहरण के लिए-
<syntaxhighlight lang=haskell>
<syntaxhighlight lang=haskell>
data Tree (z :: k) = Leaf | Fork (Tree z) (Tree z)
data Tree (z :: k) = Leaf | Fork (Tree z) (Tree z)
type FunnyTree = Tree []    -- OK
type FunnyTree = Tree []    -- OK
</syntaxhighlight>
</syntaxhighlight>
GHC 8.0.1 के बाद से, प्रकार और प्रकारों का विलय हो गया है।<ref>{{Cite web|url=https://downloads.haskell.org/~ghc/8.0.1/docs/html/users_guide/glasgow_exts.html#ghc-flag--XTypeInType|title=9.1. Language options — Glasgow Haskell Compiler Users Guide}}</ref>
जीएचसी 8.0.1 के बाद से, प्रकार और प्रकारों का विलय हो गया है।<ref>{{Cite web|url=https://downloads.haskell.org/~ghc/8.0.1/docs/html/users_guide/glasgow_exts.html#ghc-flag--XTypeInType|title=9.1. Language options — Glasgow Haskell Compiler Users Guide}}</ref>
 
 
== यह भी देखें ==
== यह भी देखें ==
* [[सिस्टम एफ-ओमेगा]]
* [[सिस्टम एफ-ओमेगा|प्रणाली एफ-ओमेगा]]
* [[शुद्ध प्रकार की प्रणाली]]
* [[शुद्ध प्रकार की प्रणाली]]


Line 70: Line 59:


{{DEFAULTSORT:Kind (Type Theory)}}[[Category: प्रकार सिद्धांत]] [[Category: डेटा के प्रकार]]  
{{DEFAULTSORT:Kind (Type Theory)}}[[Category: प्रकार सिद्धांत]] [[Category: डेटा के प्रकार]]  
<!-- general to math, logic, computing -->
[[Category: Machine Translated Page]]
[[Category: Machine Translated Page]]
[[Category:Created On 08/07/2023]]
[[Category:Created On 08/07/2023]]

Revision as of 15:16, 17 July 2023

गणितीय तर्क और कंप्यूटर विज्ञान के क्षेत्र में जिसे प्ररूप सिद्धांत के रूप में जाना जाता है, एक प्रकार प्ररूप के निर्माता का प्रकार होता है या, प्रायः, उच्च-क्रम प्रकार के ऑपरेटर का प्रकार होता है। एक प्रकार की प्रणाली अनिवार्य रूप से सरल रूप से टाइप किया गया लैम्ब्डा गणना "एक स्तर ऊपर" है, जो एक साधारण प्रकार से संपन्न है, जिसे दर्शाया जाता है और "प्रकार" कहा जाता है, जो कि किसी भी डेटा प्रकार का प्रकार है जिसे किसी भी प्रकार के पैरामीटरों की आवश्यकता नहीं होती है।

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

चूँकि उच्च-क्रम प्रकार के ऑपरेटर प्रोग्रामिंग भाषाओं में असामान्य हैं, अधिकांश प्रोग्रामिंग अभ्यास में, डेटा प्रकारों और निर्माताओं के प्रकारों के बीच अंतर करने के लिए प्रकारों का उपयोग किया जाता है, जिनका उपयोग पैरामीट्रिक बहुरूपता को लागू करने के लिए किया जाता है। प्रकार, स्पष्ट रूप से या परोक्ष रूप से, उन भाषाओं में दिखाई देते हैं जिनके प्रकार प्रणाली कार्यक्रमात्मक रूप से सुलभ तरीके से पैरामीट्रिक बहुरूपता के लिए जिम्मेदार होते हैं, जैसे सी ++,[1] हास्केल और स्काला[2]

उदाहरण

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

हास्केल में प्रकार

(नोट- हास्केल दस्तावेज़ीकरण फलन प्रकार और प्रकार दोनों के लिए एक ही तीर का उपयोग करता है।)

हास्केल 98 की प्रकार प्रणाली[4] में बिल्कुल दो प्रकार सम्मिलित हैं-

  • , उच्चारित "प्रकार" सभी डेटा प्रकारों का प्रकार है।
  • एक प्रकार का एकल प्रकार का निर्माता है, जो प्रकार का लेता है और एक प्रकार का प्रकार उत्पन्न करता है।

निवासित प्रकार (जैसा कि उचित प्रकार को हास्केल में कहा जाता है) एक ऐसा प्रकार है जिसमें मान होते हैं। उदाहरण के लिए, चित्र को संवलित बनाने वाले प्रकार वर्गों को अनदेखा करते हुए, 4 प्रकार Int का मान है, जबकि [1, 2, 3] प्रकार [Int] (Ints की सूची) का मान है। इसलिए, Int और [Int] में प्रकार होता है, लेकिन किसी भी फलन प्रकार में भी ऐसा ही होता है, उदाहरण के लिए Int -> Bool या यहां तक कि Int -> Int -> Bool

एक प्रकार का निर्माता एक या अधिक प्रकार के तर्क लेता है, और पर्याप्त तर्क प्रदान किए जाने पर डेटा प्रकार उत्पन्न करता है, अर्थात यह विच्छेदन के लिए आंशिक एप्लिकेशन का समर्थन करता है।[5][6] इस प्रकार हास्केल पैरामीट्रिक प्रकार प्राप्त करता है। उदाहरण के लिए, प्रकार [] (सूची) एक प्रकार का निर्माता है - यह सूची के तत्वों के प्रकार को निर्दिष्ट करने के लिए एकल तर्क लेता है। इसलिए, [Int] (Ints की सूची), [Float] (फ्लोट्स की सूची) और यहां तक कि [[Int]] (Ints की सूचियों की सूची) [] प्रकार के निर्माता के वैध एप्लिकेशन हैं। इसलिए, [] प्रकार का है। क्योंकि Int में प्रकार है, इसलिए इसमें [] लगाने से परिणाम प्रकार में [Int] होता है। 2-टपल निर्माता (,) में प्रकार होता है, 3-टपल निर्माता (,,) में प्रकार होता है और इसी तरह।

प्रकार अनुमान

मानक हास्केल बहुरूपी प्रकारों की अनुमति नहीं देता है। यह प्रकारों पर पैरामीट्रिक बहुरूपता के विपरीत है, जो हास्केल में समर्थित है। उदाहरण के लिए, निम्नलिखित उदाहरण में-

data Tree z  = Leaf | Fork (Tree z) (Tree z)

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

type FunnyTree = Tree []     -- invalid

क्योंकि [], का प्रकार z के लिए अपेक्षित प्रकार से मेल नहीं खाता है, जो सदैव होता है।

हालाँकि उच्च-क्रम प्रकार के ऑपरेटरों को अनुमति है। उदाहरण के लिए-

data App unt z = Z (unt z)

प्रकार है, अर्थात unt से एकल डेटा निर्माता होने की आशा है, जो इसके तर्क पर लागू होता है, जो प्रकार होना चाहिए, और एक अन्य प्रकार वापस करता है।

जीएचसी (GHC) का एक्सटेंशन PolyKinds है, जो KindSignatures के साथ मिलकर बहुरूपी प्रकारों की अनुमति देता है। उदाहरण के लिए-

data Tree (z :: k) = Leaf | Fork (Tree z) (Tree z)
type FunnyTree = Tree []     -- OK

जीएचसी 8.0.1 के बाद से, प्रकार और प्रकारों का विलय हो गया है।[7]

यह भी देखें

संदर्भ

  • Pierce, Benjamin (2002). Types and Programming Languages. MIT Press. ISBN 0-262-16209-1., chapter 29, "Type Operators and Kinding"
  1. "CS 115: Parametric Polymorphism: Template Functions". www2.cs.uregina.ca. Retrieved 2020-08-06.
  2. "उच्च प्रकार के जेनेरिक" (PDF). Archived from the original (PDF) on 2012-06-10. Retrieved 2012-06-10.
  3. Pierce (2002), chapter 32
  4. Kinds - The Haskell 98 Report
  5. "Chapter 4 Declarations and Binding". Haskell 2010 Language Report. Retrieved 23 July 2012.
  6. Miran, Lipovača. "महान भलाई के लिए हास्केल सीखें!". Making Our Own Types and Typeclasses. Retrieved 23 July 2012.
  7. "9.1. Language options — Glasgow Haskell Compiler Users Guide".