प्रकार (प्ररूप सिद्धांत): Difference between revisions
No edit summary |
No edit summary |
||
Line 3: | Line 3: | ||
प्रकार को कभी-कभी भ्रामक रूप से "(डेटा) प्रकार के प्रकार" के रूप में वर्णित किया जाता है, लेकिन यह वास्तव में योग्यता विनिर्देशक के रूप में अधिक है। वाक्यात्मक रूप से, बहुरूपी प्रकारों को प्रकार का निर्माणकर्ता मानना स्वाभाविक है, इस प्रकार गैर-बहुरूपी प्रकारों को अशक्त प्रकार का निर्माता माना जाता है। लेकिन सभी [[अशक्त]] निर्माताओं, इस प्रकार सभी एकरूपी प्रकारों का एक ही, सरलतम प्रकार होता है अर्थात् <math>*</math>। | प्रकार को कभी-कभी भ्रामक रूप से "(डेटा) प्रकार के प्रकार" के रूप में वर्णित किया जाता है, लेकिन यह वास्तव में योग्यता विनिर्देशक के रूप में अधिक है। वाक्यात्मक रूप से, बहुरूपी प्रकारों को प्रकार का निर्माणकर्ता मानना स्वाभाविक है, इस प्रकार गैर-बहुरूपी प्रकारों को अशक्त प्रकार का निर्माता माना जाता है। लेकिन सभी [[अशक्त]] निर्माताओं, इस प्रकार सभी एकरूपी प्रकारों का एक ही, सरलतम प्रकार होता है अर्थात् <math>*</math>। | ||
चूँकि उच्च-क्रम प्रकार के ऑपरेटर [[प्रोग्रामिंग भाषा|प्रोग्रामिंग भाषाओं]] में असामान्य हैं, अधिकांश प्रोग्रामिंग अभ्यास में, डेटा प्रकारों और निर्माताओं के प्रकारों के बीच अंतर करने के लिए प्रकारों का उपयोग किया जाता है, जिनका उपयोग पैरामीट्रिक बहुरूपता को लागू करने के लिए किया जाता है। प्रकार, स्पष्ट रूप से या परोक्ष रूप से, उन भाषाओं में दिखाई देते हैं जिनके प्रकार प्रणाली कार्यक्रमात्मक रूप से सुलभ तरीके से पैरामीट्रिक बहुरूपता के लिए जिम्मेदार होते हैं, जैसे [[C | चूँकि उच्च-क्रम प्रकार के ऑपरेटर [[प्रोग्रामिंग भाषा|प्रोग्रामिंग भाषाओं]] में असामान्य हैं, अधिकांश प्रोग्रामिंग अभ्यास में, डेटा प्रकारों और निर्माताओं के प्रकारों के बीच अंतर करने के लिए प्रकारों का उपयोग किया जाता है, जिनका उपयोग पैरामीट्रिक बहुरूपता को लागू करने के लिए किया जाता है। प्रकार, स्पष्ट रूप से या परोक्ष रूप से, उन भाषाओं में दिखाई देते हैं जिनके प्रकार प्रणाली कार्यक्रमात्मक रूप से सुलभ तरीके से पैरामीट्रिक बहुरूपता के लिए जिम्मेदार होते हैं, जैसे [[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> | ||
== उदाहरण == | == उदाहरण == | ||
Line 11: | Line 11: | ||
*<math>(* \rightarrow *) \rightarrow *</math> एकल प्रकार निर्माता से उचित प्रकार तक का उच्च-क्रम प्रकार का ऑपरेटर है।<ref> Pierce (2002), chapter 32</ref> | *<math>(* \rightarrow *) \rightarrow *</math> एकल प्रकार निर्माता से उचित प्रकार तक का उच्च-क्रम प्रकार का ऑपरेटर है।<ref> Pierce (2002), chapter 32</ref> | ||
== हास्केल में प्रकार == | == हास्केल में प्रकार == | ||
(''नोट''- हास्केल | (''नोट''- हास्केल प्रलेखन फ़ंक्शन प्रकार और प्रकार दोनों के लिए एक ही तीर का उपयोग करता है।) | ||
हास्केल 98 की प्रकार प्रणाली<ref name="haskell98">[http://www.haskell.org/onlinereport/decls.html#sect4.1.1 Kinds - The Haskell 98 Report]</ref> में बिल्कुल दो प्रकार सम्मिलित हैं- | हास्केल 98 की प्रकार प्रणाली<ref name="haskell98">[http://www.haskell.org/onlinereport/decls.html#sect4.1.1 Kinds - The Haskell 98 Report]</ref> में बिल्कुल दो प्रकार सम्मिलित हैं- | ||
Line 17: | Line 17: | ||
*<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> | निवासित प्रकार (जैसा कि उचित प्रकार को हास्केल में कहा जाता है) एक ऐसा प्रकार है जिसमें मान होते हैं। उदाहरण के लिए, चित्र को संवलित बनाने वाले [[प्रकार वर्ग|प्रकार वर्गों]] को अनदेखा करते हुए, <code>4</code> प्रकार <code>इंट</code> का मान है, जबकि <code>[1, 2, 3]</code> प्रकार <code>[इंट]</code> (इंट्स की सूची) का मान है। इसलिए, <code>इंट</code> और <code>[इंट]</code> में प्रकार <math>*</math> होता है, लेकिन किसी भी फ़ंक्शन प्रकार में भी ऐसा ही होता है, उदाहरण के लिए <code>इंट -> बूल</code> या यहां तक कि <code>इंट -> इंट -> बूल</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>[इंट]</code> (<code>इंट्स</code> की सूची), <code>[फ्लोट]</code> (फ्लोट्स की सूची) और यहां तक कि <code>[[इंट|[[इंट]<nowiki>]</nowiki>]]</code> (इंट्स की सूचियों की सूची) <code>[]</code> प्रकार के निर्माता के वैध एप्लिकेशन हैं। इसलिए, <code>[]</code> प्रकार का <math>* \rightarrow *</math> है। क्योंकि <code>इंट</code> में प्रकार <math>*</math> है, इसलिए इसमें <code>[]</code> लगाने से परिणाम <math>*</math> प्रकार में <code>[इंट]</code> होता है। 2-[[ टपल |टपल]] निर्माता <code>(,)</code> में प्रकार <math>* \rightarrow * \rightarrow *</math> होता है, 3-टपल निर्माता <code>(,,)</code> में प्रकार <math>* \rightarrow * \rightarrow * \rightarrow *</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> आदि भी सम्मिलित हैं। डिफ़ॉल्ट रूप से हास्केल | <code>z</code> का प्रकार कुछ भी हो सकता है, जिसमें <math>*</math>, लेकिन <math>* \rightarrow *</math> आदि भी सम्मिलित हैं। डिफ़ॉल्ट रूप से हास्केल सदैव <math>*</math> प्रकार का अनुमान लगाएगा, जब तक कि प्रकार स्पष्ट रूप से अन्यथा इंगित न करे (नीचे देखें)। इसलिए प्रकार जांचकर्ता <code>ट्री</code> के निम्नलिखित उपयोग को अस्वीकार कर देगा- | ||
<syntaxhighlight lang=haskell> | <syntaxhighlight lang=haskell> | ||
type FunnyTree = Tree [] -- invalid | type FunnyTree = Tree [] -- invalid | ||
Line 38: | Line 38: | ||
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> से एकल डेटा निर्माता होने की आशा है, जो इसके तर्क पर लागू होता है, जो प्रकार होना चाहिए, और एक अन्य प्रकार वापस करता है। | ||
[[ग्लासगो हास्केल कंपाइलर|जीएचसी (GHC)]] का एक्सटेंशन <code> | [[ग्लासगो हास्केल कंपाइलर|जीएचसी (GHC)]] का एक्सटेंशन <code>पॉलीकाइंड्स</code> है, जो <code>कांइडसिग्नेचर्स</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) |
Revision as of 15:53, 22 July 2023
गणितीय तर्क और कंप्यूटर विज्ञान के क्षेत्र में जिसे प्ररूप सिद्धांत के रूप में जाना जाता है, एक प्रकार प्ररूप के निर्माता का प्रकार होता है या, प्रायः, उच्च-क्रम प्रकार के ऑपरेटर का प्रकार होता है। एक प्रकार की प्रणाली अनिवार्य रूप से सरल रूप से टाइप किया गया लैम्ब्डा गणना "एक स्तर ऊपर" है, जो एक साधारण प्रकार से संपन्न है, जिसे दर्शाया जाता है और "प्रकार" कहा जाता है, जो कि किसी भी डेटा प्रकार का प्रकार है जिसे किसी भी प्रकार के पैरामीटरों की आवश्यकता नहीं होती है।
प्रकार को कभी-कभी भ्रामक रूप से "(डेटा) प्रकार के प्रकार" के रूप में वर्णित किया जाता है, लेकिन यह वास्तव में योग्यता विनिर्देशक के रूप में अधिक है। वाक्यात्मक रूप से, बहुरूपी प्रकारों को प्रकार का निर्माणकर्ता मानना स्वाभाविक है, इस प्रकार गैर-बहुरूपी प्रकारों को अशक्त प्रकार का निर्माता माना जाता है। लेकिन सभी अशक्त निर्माताओं, इस प्रकार सभी एकरूपी प्रकारों का एक ही, सरलतम प्रकार होता है अर्थात् ।
चूँकि उच्च-क्रम प्रकार के ऑपरेटर प्रोग्रामिंग भाषाओं में असामान्य हैं, अधिकांश प्रोग्रामिंग अभ्यास में, डेटा प्रकारों और निर्माताओं के प्रकारों के बीच अंतर करने के लिए प्रकारों का उपयोग किया जाता है, जिनका उपयोग पैरामीट्रिक बहुरूपता को लागू करने के लिए किया जाता है। प्रकार, स्पष्ट रूप से या परोक्ष रूप से, उन भाषाओं में दिखाई देते हैं जिनके प्रकार प्रणाली कार्यक्रमात्मक रूप से सुलभ तरीके से पैरामीट्रिक बहुरूपता के लिए जिम्मेदार होते हैं, जैसे C++,[1] हास्केल और स्काला।[2]
उदाहरण
- , उच्चारित "प्रकार", सभी डेटा प्रकारों का एक प्रकार है जिसे अशक्त प्रकार के निर्माताओं के रूप में देखा जाता है, और इस संदर्भ में इसे उचित प्रकार भी कहा जाता है। इसमें सामान्यतः कार्यात्मक प्रोग्रामिंग भाषाओं में फ़ंक्शन प्रकार सम्मिलित होते हैं।
- एकल प्रकार का निर्माता है, जैसे एक सूची प्रकार के निर्माता का।
- एक प्रकार का बाइनरी प्रकार का निर्माता है (विच्छेदन के माध्यम से), जैसे एक जोड़ी प्रकार के निर्माता का, और फ़ंक्शन प्रकार के निर्माता (इसके अनुप्रयोग के परिणाम से भ्रमित न हों, जो स्वयं फ़ंक्शन प्रकार है, इस प्रकार ) का भी।
- एकल प्रकार निर्माता से उचित प्रकार तक का उच्च-क्रम प्रकार का ऑपरेटर है।[3]
हास्केल में प्रकार
(नोट- हास्केल प्रलेखन फ़ंक्शन प्रकार और प्रकार दोनों के लिए एक ही तीर का उपयोग करता है।)
हास्केल 98 की प्रकार प्रणाली[4] में बिल्कुल दो प्रकार सम्मिलित हैं-
- , उच्चारित "प्रकार" सभी डेटा प्रकारों का प्रकार है।
- एक प्रकार का एकल प्रकार का निर्माता है, जो प्रकार का लेता है और एक प्रकार का प्रकार उत्पन्न करता है।
निवासित प्रकार (जैसा कि उचित प्रकार को हास्केल में कहा जाता है) एक ऐसा प्रकार है जिसमें मान होते हैं। उदाहरण के लिए, चित्र को संवलित बनाने वाले प्रकार वर्गों को अनदेखा करते हुए, 4
प्रकार इंट
का मान है, जबकि [1, 2, 3]
प्रकार [इंट]
(इंट्स की सूची) का मान है। इसलिए, इंट
और [इंट]
में प्रकार होता है, लेकिन किसी भी फ़ंक्शन प्रकार में भी ऐसा ही होता है, उदाहरण के लिए इंट -> बूल
या यहां तक कि इंट -> इंट -> बूल
।
एक प्रकार का निर्माता एक या अधिक प्रकार के तर्क लेता है, और पर्याप्त तर्क प्रदान किए जाने पर डेटा प्रकार उत्पन्न करता है, अर्थात यह विच्छेदन के लिए आंशिक एप्लिकेशन का सपोर्ट करता है।[5][6] इस प्रकार हास्केल पैरामीट्रिक प्रकार प्राप्त करता है। उदाहरण के लिए, प्रकार []
(सूची) एक प्रकार का निर्माता है - यह सूची के तत्वों के प्रकार को निर्दिष्ट करने के लिए एकल तर्क लेता है। इसलिए, [इंट]
(इंट्स
की सूची), [फ्लोट]
(फ्लोट्स की सूची) और यहां तक कि [[इंट]]
(इंट्स की सूचियों की सूची) []
प्रकार के निर्माता के वैध एप्लिकेशन हैं। इसलिए, []
प्रकार का है। क्योंकि इंट
में प्रकार है, इसलिए इसमें []
लगाने से परिणाम प्रकार में [इंट]
होता है। 2-टपल निर्माता (,)
में प्रकार होता है, 3-टपल निर्माता (,,)
में प्रकार होता है और इसी तरह।
प्रकार अनुमान
मानक हास्केल बहुरूपी प्रकारों की अनुमति नहीं देता है। यह प्रकारों पर पैरामीट्रिक बहुरूपता के विपरीत है, जो हास्केल में सपोर्टेड है। उदाहरण के लिए, निम्नलिखित उदाहरण में-
data Tree z = Leaf | Fork (Tree z) (Tree z)
z
का प्रकार कुछ भी हो सकता है, जिसमें , लेकिन आदि भी सम्मिलित हैं। डिफ़ॉल्ट रूप से हास्केल सदैव प्रकार का अनुमान लगाएगा, जब तक कि प्रकार स्पष्ट रूप से अन्यथा इंगित न करे (नीचे देखें)। इसलिए प्रकार जांचकर्ता ट्री
के निम्नलिखित उपयोग को अस्वीकार कर देगा-
type FunnyTree = Tree [] -- invalid
क्योंकि []
, का प्रकार z
के लिए अपेक्षित प्रकार से मेल नहीं खाता है, जो सदैव होता है।
हालाँकि उच्च-क्रम प्रकार के ऑपरेटरों को अनुमति है। उदाहरण के लिए-
data App unt z = Z (unt z)
प्रकार है, अर्थात यूएनटी (unt)
से एकल डेटा निर्माता होने की आशा है, जो इसके तर्क पर लागू होता है, जो प्रकार होना चाहिए, और एक अन्य प्रकार वापस करता है।
जीएचसी (GHC) का एक्सटेंशन पॉलीकाइंड्स
है, जो कांइडसिग्नेचर्स
के साथ मिलकर बहुरूपी प्रकारों की अनुमति देता है। उदाहरण के लिए-
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"
- ↑ "CS 115: Parametric Polymorphism: Template Functions". www2.cs.uregina.ca. Retrieved 2020-08-06.
- ↑ "उच्च प्रकार के जेनेरिक" (PDF). Archived from the original (PDF) on 2012-06-10. Retrieved 2012-06-10.
- ↑ Pierce (2002), chapter 32
- ↑ Kinds - The Haskell 98 Report
- ↑ "Chapter 4 Declarations and Binding". Haskell 2010 Language Report. Retrieved 23 July 2012.
- ↑ Miran, Lipovača. "महान भलाई के लिए हास्केल सीखें!". Making Our Own Types and Typeclasses. Retrieved 23 July 2012.
- ↑ "9.1. Language options — Glasgow Haskell Compiler Users Guide".