प्रकार (प्ररूप सिद्धांत)

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

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

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

उदाहरण

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

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

हास्केल 98 की प्रकार प्रणाली में बिल्कुल दो प्रकार सम्मिलित हैं-
 * $$*$$, उच्चारित "प्रकार" सभी डेटा प्रकारों का प्रकार है।
 * $$k_1 \rightarrow k_2$$ एक प्रकार का एकल प्रकार का निर्माता है, जो प्रकार का $$k_1$$ लेता है और एक प्रकार का प्रकार $$k_2$$ उत्पन्न करता है।

निवासित प्रकार (जैसा कि उचित प्रकार को हास्केल में कहा जाता है) एक ऐसा प्रकार है जिसमें मान होते हैं। उदाहरण के लिए, चित्र को संवलित बनाने वाले प्रकार वर्गों को अनदेखा करते हुए,  प्रकार   का मान है, जबकि    प्रकार   (इंट्स की सूची) का मान है। इसलिए,   और   में प्रकार $$*$$ होता है, लेकिन किसी भी फ़ंक्शन प्रकार में भी ऐसा ही होता है, उदाहरण के लिए   या यहां तक कि  ।

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

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

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

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

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

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

यह भी देखें

 * प्रणाली एफ-ओमेगा
 * शुद्ध प्रकार की प्रणाली

संदर्भ

 * , chapter 29, "Type Operators and Kinding"