प्रकार के सिद्धांत में सही शब्दावली: प्रकार, प्रकार के निर्माता, प्रकार / प्रकार और मूल्य


14

पिछले प्रश्न के उत्तर में , कुछ निर्माणों के लिए सही शब्दावली के बारे में एक छोटी सी बहस शुरू हुई। मैं एक सवाल (अलावा अन्य नहीं मिला जैसा कि इस या कि , जो बहुत सही बात नहीं है) यह स्पष्ट रूप से पता करने के लिए, मैं इस नए एक बना रहा हूँ।

संदिग्ध शब्द और उनके संबंध हैं: प्रकार, प्रकार निर्माता, प्रकार पैरामीटर, प्रकार या प्रकार, और मान

मैंने टाइप थ्योरी के लिए विकिपीडिया की भी जाँच की , लेकिन यह भी स्पष्ट नहीं किया।

तो एक अच्छा संदर्भ उत्तर देने के लिए और मेरी अपनी समझ की जाँच करने के लिए:

  • इन चीजों को कैसे ठीक से परिभाषित किया जाता है?
  • इनमें से प्रत्येक चीज़ में क्या अंतर है?
  • वे एक दूसरे से कैसे संबंधित हैं?

जवाबों:


13

ठीक है, हम एक-एक करके चलते हैं।

मान

मान डेटा के ठोस टुकड़े हैं जो प्रोग्राम मूल्यांकन और जॉगल करते हैं। कुछ भी नहीं फैंसी, कुछ उदाहरण हो सकता है

  • 1
  • true
  • "fizz buzz foo bar"

प्रकार

एक प्रकार के लिए एक अच्छा विवरण "एक मूल्य के लिए एक वर्गीकरण" है। एक प्रकार थोड़ी जानकारी है कि रनटाइम पर क्या मूल्य होगा, लेकिन संकलन समय पर संकेत दिया गया है।

उदाहरण के लिए यदि आप मुझे बताते हैं कि e : boolसंकलन के समय, और मुझे पता होगा कि या eतो रनटाइम के दौरान, और कुछ नहीं! क्योंकि प्रकार इस तरह से मूल्यों को वर्गीकृत करते हैं, इसलिए हम इस जानकारी का उपयोग आपके कार्यक्रम के कुछ बुनियादी गुणों को निर्धारित करने के लिए कर सकते हैं।truefalse

उदाहरण के लिए, अगर मैं कभी आपको जोड़कर देखता हूं eऔर e'कब e : intऔर e' : Stringफिर, मुझे पता है कि कुछ बंद है! वास्तव में, मैं इसे ध्वजांकित कर सकता हूं और "अरे, यह बिल्कुल भी कोई मतलब नहीं है!"

एक अधिक शक्तिशाली प्रकार की प्रणाली अधिक दिलचस्प प्रकारों के लिए अनुमति देती है जो अधिक दिलचस्प मूल्यों को वर्गीकृत करती है। उदाहरण के लिए, आइए कुछ फ़ंक्शन पर विचार करें

f = fun x -> x

यह बहुत स्पष्ट है कि f : Something -> Something, लेकिन क्या होना Somethingचाहिए? एक उबाऊ प्रकार की प्रणाली में, हमें कुछ मनमाना निर्दिष्ट करना होगा, जैसे Something = int। अधिक लचीली प्रकार प्रणाली में, हम कह सकते हैं

f : forall a. a -> a

यह कहना है "के लिए किसी भी a, fनक्शे aएक a"। आइए हम fअधिक सामान्यतः उपयोग करें और अधिक दिलचस्प कार्यक्रम लिखें।

इसके अलावा, कंपाइलर ने हमारे द्वारा दिए गए क्लासिफायर को संतुष्ट करने के लिए वास्तव में जांच करने जा रहा है, अगर f = fun x -> trueतब हमारे पास बग है और कंपाइलर ऐसा कहेगा!

तो एक tldr के रूप में; एक प्रकार एक संकलित समय बाधा है मूल्यों पर एक अभिव्यक्ति रनटाइम पर हो सकती है।

कन्स्ट्रक्टर टाइप करें

कुछ प्रकार संबंधित हैं। उदाहरण के लिए पूर्णांकों की एक सूची तार की सूची के समान है। यह लगभग sortपूर्णांक के लिए कैसे है लगभग sortस्ट्रिंग के लिए पसंद है। हम एक तरह की फैक्ट्री की कल्पना कर सकते हैं जो इन अंतरों को सामान्य बनाकर और उनके मांग के आधार पर इनका निर्माण करती है। यह एक प्रकार का कंस्ट्रक्टर है। यह प्रकारों से प्रकारों के लिए एक फ़ंक्शन की तरह है, लेकिन थोड़ा अधिक सीमित है।

क्लासिक उदाहरण एक सामान्य सूची है। एक प्रकार का निर्माणकर्ता केवल सामान्य परिभाषा है

 data List a = Cons a (List a) | Nil

अब Listएक फ़ंक्शन है जो aउस प्रकार के मूल्यों की सूची के लिए एक प्रकार का मानचित्र बनाता है! जावा-भूमि में मुझे लगता है कि इन्हें शायद "सामान्य वर्ग" कहा जाता है

पैरामीटर्स टाइप करें

एक प्रकार का पैरामीटर सिर्फ टाइप कंस्ट्रक्टर (या फ़ंक्शन) के लिए दिया गया प्रकार है। जैसे मान स्तर में हम कहेंगे foo(a)कि एक पैरामीटर है aठीक उसी तरह जैसे कि List aएक प्रकार का पैरामीटर कैसे होता है a

प्रकार

किंड्स थोड़े ट्रिकी होते हैं। मूल विचार यह है कि कुछ प्रकार समान होते हैं। उदाहरण के लिए, हम जावा में सभी आदिम प्रकार है int, char, float... जो सभी व्यवहार के रूप में यदि वे एक ही "प्रकार" है। सिवाय, जब हम खुद प्रकारों के लिए क्लासिफायर की बात कर रहे हैं, तो हम क्लासिफायर टाइप कहते हैं। तो int : Prim, String : Box, List : Boxed -> Boxed

यह प्रणाली इस बात के बारे में अच्छे ठोस नियम देती है कि हम किस प्रकार के प्रकारों का उपयोग कर सकते हैं, ठीक उसी तरह जैसे कि किस प्रकार मूल्यों को नियंत्रित करते हैं। यह स्पष्ट रूप से कहना बकवास होगा

 List<List>

या

 List<int>

जावा में चूंकि Listउस तरह इस्तेमाल किए जाने के लिए एक ठोस प्रकार पर लागू करने की आवश्यकता है! यदि हम उनके प्रकारों को देखते हैं List : Boxed -> Boxedऔर चूंकि Boxed -> Boxed /= Boxed, उपरोक्त एक प्रकार की त्रुटि है!

अधिकांश समय हम वास्तव में प्रकारों के बारे में नहीं सोचते हैं और बस उन्हें "सामान्य ज्ञान" के रूप में मानते हैं, लेकिन कट्टरपंथी प्रकार के सिस्टम के बारे में सोचना महत्वपूर्ण है।

अब तक जो कुछ मैं कह रहा हूं उसका थोड़ा चित्रण

 value   : type : kind  : ...
 true    : bool : Prim  : ...
 new F() : Foo  : Boxed : ...

विकिपीडिया से बेहतर पढ़ना

यदि आप इस प्रकार की रुचि रखते हैं, तो मैं एक अच्छी पाठ्यपुस्तक का निवेश करने की अत्यधिक सलाह दूंगा। सामान्य रूप से टाइप थ्योरी और पीएलटी काफी विशाल है और ज्ञान के सुसंगत आधार के बिना आप (या कम से कम मैं) महीनों तक बिना रुके घूम सकते हैं।

मेरी दो पसंदीदा पुस्तकें हैं

  • प्रकार और प्रोग्रामिंग भाषा - बेन पियर्स
  • प्रोग्रामिंग भाषाओं की व्यावहारिक नींव - बॉब हार्पर

दोनों उत्कृष्ट पुस्तकें हैं जो परिचय देती हैं कि मैंने अभी क्या बात की है और बहुत अधिक सुंदर, अच्छी तरह से समझाया गया है।


1
प्रकार सेट हैं? मुझे "क्लासिफायर" बेहतर लगता है, लेकिन आप इसका मतलब नहीं समझाते हैं और एक प्रकार की अच्छी समझ के बिना, आपके उत्तर के बाकी प्रकार नीचे गिर जाते हैं।
रॉबर्ट हार्वे

@RobertHarvey अब कैसा दिखता है, मैंने सेट के सभी उल्लेखों को छोड़ दिया है :)
डैनियल ग्रैज़र

1
बहुत बेहतर ....
रॉबर्ट हार्वे

@RobertHarvey मुझे बहुत सहज के सेट के रूप में प्रकारों के दृश्य मिलते हैं। जैसे intजावा में टाइप में 2 ^ 64 अलग-अलग मान होते हैं। उप-प्रकार शामिल होने पर सेट के साथ सादृश्य टूट जाता है, लेकिन यह एक अच्छा पर्याप्त प्रारंभिक अंतर्ज्ञान है, विशेष रूप से एक बार जब आप बीजीय डेटा प्रकारों पर विचार करते हैं (जैसे दो प्रकारों के एक संघ में किसी भी प्रकार के सदस्य शामिल हो सकते हैं; यह उन सेटों का संघ है। ।
डोभाल

@ डोभाल: अगर मैं एक ऐसी क्लास लिखता हूँ, जो ग्राहक का वर्णन करती है, तो यह शायद ग्राहकों के "सेट" का प्रतिनिधित्व करने वाली है, क्योंकि मैं उदाहरणों का एक संग्रह बनाने जा रहा हूँ। लेकिन यह कहना कि एक ग्राहक एक प्रकार है क्योंकि यह ग्राहकों के एक "सेट" का वर्णन करता है एक शब्द है; यह स्पष्ट लगता है। क्या अधिक दिलचस्प है कि ग्राहक का प्रकार ग्राहक की विशेषताओं का वर्णन करता है । यह समझाने के लिए "सेट" का उपयोग अधिक लगता है ... वास्तव में यह अमूर्त है। जब तक, शायद, आप एक गणितज्ञ हैं।
रॉबर्ट हार्वे

2

इन चीजों को कैसे ठीक से परिभाषित किया जाता है?

उन्हें कठोर, अकादमिक गणितीय समर्थन द्वारा ठीक से परिभाषित किया गया है, जो वे हैं, वे कैसे काम करते हैं और क्या गारंटी है, के रूप में मजबूत दावे प्रदान करते हैं।

लेकिन प्रोग्रामर्स को मोटे तौर पर यह जानने की जरूरत नहीं है। उन्हें अवधारणाओं को समझने की जरूरत है।

मान

आइए मूल्यों से शुरू करें, क्योंकि सब कुछ वहीं से बनता है। मान कंप्यूटिंग में उपयोग किए जाने वाले डेटा हैं। दृष्टिकोण के आधार पर, वे ऐसे मान हैं, जिनसे हर कोई परिचित है: 42, 3.14, "अब कैसी भूरी गाय", कार्मिक जेनी को लेखांकन, आदि में रिकॉर्ड करते हैं।

मूल्यों की अन्य व्याख्याएं प्रतीक हैं । अधिकांश प्रोग्रामर इन प्रतीकों को एक प्रतिज्ञान के "मूल्य" के रूप में समझते हैं। Leftऔर Rightएनम के लिए प्रतीक हैं Handedness(अस्पष्ट लोगों और मछलियों की अनदेखी)।

कार्यान्वयन के बावजूद, मान अलग-अलग चीजें हैं जो भाषा गणना करने के लिए काम करती है।

प्रकार

मूल्यों के साथ समस्या यह है कि सभी गणना सभी मूल्यों के लिए कानूनी नहीं हैं। 42 + goatवास्तव में कोई मतलब नहीं है।

यह वह जगह है जहाँ प्रकार खेलने में आते हैं। प्रकार मेटाडेटा हैं जो मानों के सबसेट को परिभाषित करते हैं। HandednessEnum के ऊपर एक अच्छा उदाहरण है। इस प्रकार का कहना है कि "केवल Leftऔर Rightयहां इस्तेमाल किया जा सकता है"। यह कार्यक्रमों को बहुत जल्दी निर्धारित करने की अनुमति देता है कि कुछ संचालन में त्रुटि होगी।

विचार करने के लिए एक और व्यावहारिक उपयोग यह है कि हुड के तहत, कंप्यूटर बाइट्स के साथ काम करते हैं। बाइट 42 का मतलब संख्या 42 हो सकता है, या इसका मतलब चरित्र * हो सकता है, या इसका मतलब हो सकता है जेनी अकाउंटिंग से। प्रकार भी (व्यावहारिक उपयोग में, सैद्धांतिक रूप से इतना नहीं) कंप्यूटर द्वारा उपयोग किए जाने वाले बाइट्स के अंतर्निहित संग्रह के लिए एन्कोडिंग को परिभाषित करने में मदद करते हैं।

प्रकार

और यहाँ है जहाँ हम थोड़ा बाहर जाना शुरू करते हैं। इसलिए, जब एक प्रोग्रामिंग भाषा में एक चर होता है जो एक प्रकार को संदर्भित करता है, तो यह किस प्रकार का होता है?

उदाहरण के लिए, जावा और C # में, इसका प्रकार है Type(जिसका प्रकार है Type, जिसके पास ... और इसी तरह सभी नीचे हैं)। यह प्रकार के पीछे की अवधारणा है । कुछ भाषाओं में, आप जावा और C # की तुलना में एक प्रकार के चर के साथ थोड़ी अधिक उपयोगी चीजें कर सकते हैं। एक बार ऐसा होता है कि यह कहना उपयोगी बन जाता है "मैं एक प्रकार है कि एक मूल्य चाहते हैं, लेकिन यह भी कुछ है प्रकार की IEnumerable<int>"। टा-दा! प्रकार।

अधिकांश प्रोग्रामर जावा और सी # सामान्य बाधाओं जैसे प्रकारों के बारे में सोच सकते हैं। विचार करें public class Foo<T> where T: IComparable{}। प्रकार वाली भाषा में, T: kindOf(IComparable)परिवर्तनीय घोषणा कानूनी हो जाती है; सिर्फ एक खास चीज नहीं जिसे आप क्लास और फंक्शन डिक्लेरेशन में कर सकें।

कंस्ट्रक्टर्स टाइप करें

शायद अनिश्चित रूप से, प्रकार के निर्माता केवल प्रकारों के लिए निर्माता हैं । "लेकिन आप एक प्रकार का निर्माण कैसे करते हैं? प्रकार बस हैं ।" एह ... इतना नहीं।

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

एक प्रकार के निर्माण का सबसे सर्वव्यापी उदाहरण एक सरणी परिभाषा है int[4]:। यहां आप 4टाइप कंस्ट्रक्टर को निर्दिष्ट कर रहे हैं , जो int4 प्रविष्टियों के साथ आपको एक सरणी बनाने के लिए मान का उपयोग करता है । यदि आपने एक अलग इनपुट प्रकार निर्दिष्ट किया है, तो आपको एक अलग आउटपुट प्रकार मिलेगा।

जेनरिक एक अन्य प्रकार के निर्माता हैं, एक अन्य प्रकार को उनके इनपुट के रूप में लेते हैं।

कई भाषाओं में एक टाइप कंस्ट्रक्टर होता है, जो टाइप P -> Rकरने के लिए एक फंक्शन का प्रतिनिधित्व करता है जो टाइप Pऔर रिटर्न टाइप लेता है R

अब, संदर्भ निर्धारित करेगा कि क्या "फ़ंक्शन जो एक प्रकार देता है" एक प्रकार का निर्माता है या नहीं। मेरे (संयुक्त रूप से सीमित) अनुभव में, लाइन "क्या आप इस प्रकार का संकलन समय पर उपयोग कर सकते हैं?"। हाँ? टाइप कंस्ट्रक्टर। नहीं? सिर्फ एक फंक्शन।

पैरामीटर लिखें

तो आपको याद है टाइप कंस्ट्रक्टर्स को दिए गए पैरामीटर? वे आमतौर पर टाइप पैरामीटर्स के रूप में जाने जाते हैं, क्योंकि टाइप कन्स्ट्रक्टर का सामान्य रूप Type[param]या है Type<param>


1
क्या आप 'प्रकार' के बारे में स्पष्ट कर सकते हैं / बढ़ा सकते हैं? हास्केल में, एक प्रकार का प्रकार होता है *, जबकि एक प्रकार का निर्माता (एक तर्क के साथ) प्रकार होता है * -> *। बाधाएं जैसे कि (Num a) => a(मतलब "कोई भी प्रकार aजो Numटाइपकास्ट का एक उदाहरण है ") स्वयं प्रकार नहीं हैं। टाइपसेकल्स Numस्वयं एक 'प्रकार' नहीं है, लेकिन इस प्रकार का है * -> Constraint। मुझे एक 'तरह' के हास्केल विचार से संबंधित होना मुश्किल लगता है (जो मुझे लगता है कि आपके द्वारा दिए गए उदाहरणों में टाइप सिद्धांत में प्रकारों से निकटता से संबंधित है)।
जॉन बार्थोलोम्यू

मुझे कहना चाहिए, ghci के :kindआदेश के Numरूप में की तरह देता है * -> Constraint। यह जीएचसी के लिए विशिष्ट हो सकता है, मुझे नहीं पता।
जॉन बार्थोलोमेव

@ जोहानबर्थोलोमेव - हस्केल किंड्स "टाइप कन्स्ट्रक्टर्स के लिए हस्ताक्षर" अधिक हैं। दुर्भाग्य से, मेरा हास्केल उस बिंदु के करीब नहीं है जहां मैं विशेष के बारे में बहुत अधिक बात करने में सहज होगा।
तेलेस्टिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.