प्रकार (प्ररूप सिद्धांत)
गणितीय तर्क और कंप्यूटर विज्ञान के क्षेत्र में जिसे प्रकार सिद्धांत के रूप में जाना जाता है, एक प्रकार एक प्रकार के कंस्ट्रक्टर का प्रकार होता है या, कम सामान्यतः, एक उच्च-क्रम प्रकार के ऑपरेटर का प्रकार होता है। एक प्रकार की प्रणाली अनिवार्य रूप से एक स्तर ऊपर टाइप किया गया लैम्ब्डा कैलकुलस है, जो एक आदिम प्रकार से संपन्न है, जिसे दर्शाया गया है और इसे प्रकार कहा जाता है, जो किसी भी डेटा प्रकार का प्रकार है जिसे किसी पैरामीट्रिक बहुरूपता की आवश्यकता नहीं होती है।
एक प्रकार को कभी-कभी भ्रामक रूप से डेटा प्रकार|(डेटा) प्रकार के प्रकार के रूप में वर्णित किया जाता है, लेकिन यह वास्तव में एक एरिटी विनिर्देशक के रूप में अधिक है। वाक्यात्मक रूप से, बहुरूपी प्रकारों को प्रकार का निर्माणकर्ता मानना स्वाभाविक है, इस प्रकार गैर-बहुरूपी प्रकारों को अशक्त प्रकार का रचनाकार माना जाता है। लेकिन सभी अशक्त रचनाकारों, इस प्रकार सभी मोनोमोर्फिक प्रकारों का एक ही, सरलतम प्रकार होता है; अर्थात् .
चूँकि प्रोग्रामिंग भाषाओं में उच्च-क्रम प्रकार के ऑपरेटर असामान्य हैं, अधिकांश प्रोग्रामिंग अभ्यास में, प्रकार का उपयोग डेटा प्रकारों और कंस्ट्रक्टर के प्रकारों के बीच अंतर करने के लिए किया जाता है, जिनका उपयोग पैरामीट्रिक बहुरूपता को लागू करने के लिए किया जाता है। प्रकार, स्पष्ट रूप से या परोक्ष रूप से, उन भाषाओं में प्रकट होते हैं जिनके प्रकार सिस्टम प्रोग्रामेटिक रूप से सुलभ तरीके से पैरामीट्रिक बहुरूपता के लिए जिम्मेदार होते हैं, जैसे कि C++,[1] हास्केल (प्रोग्रामिंग भाषा) और स्काला (प्रोग्रामिंग भाषा).[2]
उदाहरण
- , उच्चारित प्रकार , सभी डेटा प्रकारों का एक प्रकार है जिसे अशक्त प्रकार के कंस्ट्रक्टर के रूप में देखा जाता है, और इस संदर्भ में इसे उचित प्रकार भी कहा जाता है। इसमें सामान्यतः कार्यात्मक प्रोग्रामिंग भाषाओं में फ़ंक्शन प्रकार शामिल होते हैं।
- एक एकात्मक कार्य प्रकार का कंस्ट्रक्टर है, उदाहरण के लिए एक सूची प्रकार के कंस्ट्रक्टर का।
- एक विक्षनरी का प्रकार है: बाइनरी प्रकार का कंस्ट्रक्टर (करीइंग के माध्यम से), उदाहरण के लिए एक जोड़ी प्रकार के कंस्ट्रक्टर का, और एक फ़ंक्शन प्रकार के कंस्ट्रक्टर का भी (इसके अनुप्रयोग के परिणाम के साथ भ्रमित न हों, जो स्वयं एक फ़ंक्शन प्रकार है, इस प्रकार )
- यूनरी प्रकार के कंस्ट्रक्टर से उचित प्रकार तक एक उच्च-क्रम प्रकार का ऑपरेटर है।[3]
हास्केल में प्रकार
(नोट: हास्केल दस्तावेज़ फ़ंक्शन प्रकार और प्रकार दोनों के लिए एक ही तीर का उपयोग करता है।)
हास्केल की प्रकार प्रणाली (प्रोग्रामिंग भाषा)[4] बिल्कुल दो प्रकार शामिल हैं:
- , उच्चारित प्रकार सभी डेटा प्रकारों का प्रकार है।
- एक यूनरी फ़ंक्शन प्रकार का कंस्ट्रक्टर है, जो एक प्रकार का प्रकार लेता है और एक प्रकार का उत्पादन करता है .
एक निवास प्रकार (जैसा कि हास्केल में उचित प्रकार कहा जाता है) एक ऐसा प्रकार है जिसमें मूल्य होते हैं। उदाहरण के लिए, चित्र को जटिल बनाने वाले प्रकार वर्गों को अनदेखा करना, 4
प्रकार का मान है Int
, जबकि [1, 2, 3]
प्रकार का मान है [Int]
(इंट्स की सूची)। इसलिए, Int
और [Int]
दयालु हो , लेकिन उदाहरण के लिए, कोई भी फ़ंक्शन प्रकार भी ऐसा ही करता है Int -> Bool
या और भी Int -> Int -> Bool
.
एक टाइप कंस्ट्रक्टर एक या अधिक प्रकार के तर्क लेता है, और पर्याप्त तर्क दिए जाने पर एक डेटा प्रकार तैयार करता है, यानी यह करीइंग के लिए आंशिक एप्लिकेशन का समर्थन करता है।[5][6] इस प्रकार हास्केल पैरामीट्रिक प्रकार प्राप्त करता है। उदाहरण के लिए, प्रकार []
(सूची) एक प्रकार का कंस्ट्रक्टर है - यह सूची के तत्वों के प्रकार को निर्दिष्ट करने के लिए एक एकल तर्क लेता है। इस तरह, [Int]
(इंट्स की सूची), [Float]
(फ्लोट्स की सूची) और यहां तक कि [[Int]]
(इंट्स की सूचियों की सूची) के वैध अनुप्रयोग हैं []
कंस्ट्रक्टर टाइप करें। इसलिए, []
एक प्रकार का प्रकार है . क्योंकि 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
एक यूनरी डेटा कंस्ट्रक्टर होने की उम्मीद है, जो इसके तर्क पर लागू होता है, जो एक प्रकार होना चाहिए, और एक अन्य प्रकार लौटाता है।
ग्लासगो हास्केल कंपाइलर का विस्तार है PolyKinds
, जो, साथ में KindSignatures
, बहुरूपी प्रकारों की अनुमति देता है। उदाहरण के लिए:
data Tree (z :: k) = Leaf | Fork (Tree z) (Tree z)
type FunnyTree = Tree [] -- OK
GHC 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".