2012-04-20 7 views
13

मैं हास्केल के लिए एक नवागंतुक हूं और वर्तमान में रियल वर्ल्ड हास्केल के माध्यम से जा रहा हूं। पुस्तक का कहना है कि टाइप कन्स्ट्रक्टर का उपयोग केवल टाइप हस्ताक्षर में किया जाता है जबकि वास्तविक कंट्रोलर में वैल्यू कन्स्ट्रक्टर का उपयोग किया जाता है। यह यह दिखाने के लिए एक घोषणा का एक उदाहरण भी देता है कि दोनों के नाम एक-दूसरे से स्वतंत्र हैं। पहली जगह में दो रचनाकारों की आवश्यकता क्यों है, यदि उनमें से केवल एक वास्तविक कोड में उपयोग किया जाता है? चूंकि हम वास्तविक कोड में प्रकार के कन्स्ट्रक्टर का उपयोग नहीं करेंगे, टाइप कन्स्ट्रक्टर किस उद्देश्य का काम करता है?हास्केल में टाइप कन्स्ट्रक्टर के अलावा एक मूल्य कन्स्ट्रक्टर क्यों है?

+11

वाक्यांश "वास्तविक कोड" दुर्भाग्यपूर्ण है, क्योंकि इसका तात्पर्य है कि आप प्रोग्राम्स में प्रकार के कन्स्ट्रक्टर का उपयोग नहीं करेंगे, जब लेखकों का वास्तव में मतलब है कि टाइपर कन्स्ट्रक्टर केवल टाइप एनोटेशन के लिए उपयोग किए जाते हैं। यह कहने के बराबर है कि आपको सी में "int" या "long" कीवर्ड की आवश्यकता नहीं है क्योंकि आप उन्हें वास्तविक कोड में उपयोग नहीं करते हैं (वे केवल घोषणाओं में उपयोग किए जाते हैं, जो "वास्तविक कोड" के रूप में नहीं गिने जाते हैं "इस मानक से)। –

+0

... कोई स्वीकार नहीं करता है? :) –

उत्तर

22

शायद नाम थोड़ा भ्रामक हैं। टाइप कन्स्ट्रक्टर आपके द्वारा घोषित किए जा रहे प्रकार के नाम का प्रतिनिधित्व करता है। उन्हें इस तरह कहा जाता है क्योंकि वे प्रकार बनाते हैं, मान नहीं: वास्तव में, (संभवतः) प्रकार चर पर पैरामीटरकृत होते हैं, वे प्रकार के परिवार को परिभाषित करते हैं। वे सी ++ के टेम्पलेट्स और जावा के जेनेरिक जैसे कुछ कार्य करते हैं। data MyType a b = Constr a b में, माईटाइप एक प्रकार का कन्स्ट्रक्टर है जो एक नया प्रकार (MyType a b) बनाने के लिए दो प्रकार a और b लेता है।

वैल्यू कन्स्ट्रक्टर एकमात्र ऐसा हिस्सा है जिसे आप अन्य (ऑब्जेक्ट ओरिएंटेड) भाषाओं में "कन्स्ट्रक्टर" कहते हैं, क्योंकि आपको उस प्रकार के मान बनाने के लिए इसकी आवश्यकता होती है। तो, पिछले उदाहरण में, यदि आप मान कन्स्ट्रक्टर Constr :: a -> b -> MyType a b लेते हैं, तो आप एक मान Constr "abc" 'd' :: MyType [Char] Char बना सकते हैं। प्रकारों और मानों के बारे में अंतर्ज्ञान पाने के लिए

+2

क्या मैं पूछ सकता हूं कि उस -1 से छुटकारा पाने के लिए मेरा जवाब कैसे सुधारें? क्या गलत है? –

7

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

इसलिए, क्योंकि आप एक प्रकार के मूल्य के आधार पर रन-टाइम पर स्पष्ट रूप से शाखा नहीं कर सकते हैं (हालांकि आप टाइपक्लास के साथ निस्संदेह कर सकते हैं), टाइप कन्स्ट्रक्टर रन-टाइम ऑब्जेक्ट्स के रूप में पूरी तरह बेकार हैं और कई मामलों में पूरी तरह से अनुपस्थित हैं अंतिम बाइनरी इसके विपरीत, क्योंकि मान निर्माता रचनात्मक समय पर अपने प्रकार के सेट में मूल्यों को बनाने की अनुमति देते हैं, वे संकलन-समय वस्तु के रूप में पूरी तरह बेकार हैं।

इस साधारण संपत्ति के कारण, टाइप कन्स्ट्रक्टर और वैल्यू कन्स्ट्रक्टर नामों को अनजाने में साझा कर सकते हैं।

+0

यह अनिवार्य पृष्ठभूमि से आने वाले लोगों के लिए समझने का उत्तर सबसे आसान है! –

16

यह कहने की तरह थोड़ा सा है "हमें कक्षाएं और ऑब्जेक्ट्स की आवश्यकता क्यों है यदि वस्तुएं वास्तव में चलती हैं?"

दो प्रकार के निर्माता विभिन्न नौकरियां करते हैं। प्रकार रचनाकार टाइप प्रकार हस्ताक्षर में जाओ। मूल्य रचनाकार चलाने योग्य कोड में जाते हैं।

सबसे सरल मामले में, एक प्रकार "कन्स्ट्रक्टर" सिर्फ एक प्रकार का नाम है। सबसे सरल मामले में, एक प्रकार में केवल एक मान कन्स्ट्रक्टर होता है। तो तुम

data Point = Point Int Int

जैसी चीजों के साथ खत्म करने के लिए आप अपने आप को कहते हैं, "अब मैं क्यों बिल्ली Point दो बार लिखने की ज़रूरत?"

data Tree x = Leaf x | Branch (Tree x) (Tree x)

यहाँ Tree एक प्रकार निर्माता है:

लेकिन अब एक कम तुच्छ उदाहरण पर विचार करें।आप इसे एक प्रकार का तर्क देते हैं, और यह एक प्रकार का "निर्माण" करता है। तो Tree Int एक प्रकार है, Tree String एक और प्रकार है, और इसी तरह। (सी ++ में टेम्पलेट्स या जावा या एफिल में जेनेरिक की तरह।)

दूसरी ओर, Leaf एक मूल्य निर्माता है। एक मूल्य को देखते हुए, यह 1-नोड का पेड़ बनाता है। तो Leaf 5 एक Tree Int मान है, Leaf "banana" एक Tree String मान है, और इसी तरह।

इसी तरह Branch के लिए। इसमें दो पेड़ के मूल्य होते हैं और बच्चों के रूप में उन पेड़ों के साथ पेड़ नोड बनाते हैं। उदाहरण के लिए, Branch (Leaf 2) (Leaf 7) एक Tree Int मान है।

+0

विस्तृत स्पष्टीकरण के लिए धन्यवाद! –

संबंधित मुद्दे