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

From Vigyanwiki
No edit summary
No edit summary
Line 6: Line 6:
== उदाहरण ==
== उदाहरण ==


* <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>
== हास्केल में प्रकार ==
== हास्केल में प्रकार ==
(''नोट''- हास्केल दस्तावेज़ीकरण फलन प्रकार और प्रकार दोनों के लिए एक ही तीर का उपयोग करता है।)
(''नोट''- हास्केल दस्तावेज़ीकरण फ़ंक्शन प्रकार और प्रकार दोनों के लिए एक ही तीर का उपयोग करता है।)


हास्केल 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>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>।  
निवासित प्रकार (जैसा कि उचित प्रकार को हास्केल में कहा जाता है) एक ऐसा प्रकार है जिसमें मान होते हैं। उदाहरण के लिए, चित्र को संवलित बनाने वाले [[प्रकार वर्ग|प्रकार वर्गों]] को अनदेखा करते हुए, <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> (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> होता है और इसी तरह।
एक प्रकार का निर्माता एक या अधिक प्रकार के तर्क लेता है, और पर्याप्त तर्क प्रदान किए जाने पर डेटा प्रकार उत्पन्न करता है, अर्थात यह विच्छेदन के लिए आंशिक एप्लिकेशन का समर्थन करता है।<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> होता है और इसी तरह।

Revision as of 17:08, 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".