क्या हास्केल का प्रकार प्रणाली कार्यात्मक प्रोग्रामिंग को समझने में बाधा है? [बन्द है]


33

मैं कार्यात्मक प्रोग्रामिंग को समझने के उद्देश्य से हास्केल का अध्ययन कर रहा हूं, इस अपेक्षा के साथ कि मैं अन्य भाषाओं में प्राप्त अंतर्दृष्टि को लागू करूंगा (ग्रूवी, पायथन, जावास्क्रिप्ट मुख्य रूप से।)

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

मैंने हास्केल सीखने का चयन नहीं किया क्योंकि मैं एक अत्यंत कठोर प्रकार की प्रणाली को नेविगेट करने में रुचि रखता था।

मेरा सवाल यह है: क्या एक मजबूत प्रकार की प्रणाली एक अत्यंत शुद्ध कार्यात्मक भाषा का आवश्यक उत्पाद है, या यह हास्केल के लिए एक असंबंधित डिजाइन विकल्प है?


6
यदि आप स्पष्ट रूप से कुछ भी लिखना नहीं चाहते हैं, तो आपको स्पष्ट रूप से कुछ भी लिखने की आवश्यकता नहीं है। हास्केल अपने आप ही ठीक प्रकार का अनुमान लगा सकता है। और ऐसा नहीं है कि आप दो असंगत प्रकारों को संग्रहीत करने वाले एक एकल चर के लिए जा रहे हैं।
आनन।

4
@ हां, लेकिन आपकी सूचियां सजातीय होनी चाहिए। मेरा विश्वास करो, इस तरह की चीज रास्ते में मिल सकती है, यहां तक ​​कि प्रकार के अनुमान के साथ भी।
एरिक विल्सन

13
@FarmBoy और शायद के उपयोग के साथ गलत क्या है? जावा वास्तव में आपको सभी वर्गों पर शायद उपयोग करता है, जो कि अजीब बात है।
वैकल्पिक

3
और अगर आप वास्तव में एक विषम सूची का उपयोग करना चाहते हैं, तो आप बीजगणितीय डेटा प्रकारों का उपयोग कर सकते हैं।
वैकल्पिक

1
@mathepic इस बिंदु पर हमने वास्तव में अपने मूल प्रश्न का ट्रैक खो दिया है, जो एक पूरी तरह से वैध प्रश्न था।
एरिक विल्सन

जवाबों:


40

मेरा मानना ​​है कि हास्केल के प्रकार प्रणाली को समझना कार्यात्मक प्रोग्रामिंग को समझने के लिए एक एम्पलीफायर है।

विशुद्ध रूप से कार्यात्मक प्रोग्रामिंग के बारे में बात यह है कि साइड-इफेक्ट्स की अनुपस्थिति में, जो आपको सभी प्रकार की चीजों को अंतर्निहित रूप से करने की अनुमति देता है, विशुद्ध रूप से कार्यात्मक प्रोग्रामिंग आपके कार्यक्रमों की संरचना को बहुत अधिक स्पष्ट करता है।

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

यदि हास्केल को दृढ़ता से टाइप नहीं किया गया था, तो मोनैड्स, एप्लिकेटिव फ़ंक्शंस और जैसी अवधारणाओं को कभी भी प्रोग्रामिंग पर लागू नहीं किया गया था।


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

2
मुझे पता है कि यह एक सुपर पुराना उत्तर है, लेकिन मैं वास्तव में असहमत हूं। मुझे लगता है कि, जैसा कि स्पष्ट है कि कुछ चीजें भाषा में हो सकती हैं, प्रकार की प्रणाली, विशेष रूप से राज्य और पारसेक जैसे साधुओं के साथ, कालीन के नीचे सामान का एक टन स्वीप करता है । यह वास्तव में भाषा के पुस्तकालयों को सीखने की मेरी क्षमता के साथ बहुत हस्तक्षेप है।
सवन्नी डी'गेरिनल

4
@ SavanniD'Gerinel: मुझे लगता है कि इस जवाब में "कालीन के नीचे की चीजों को चमकाना" का मतलब अंतर्निहित कार्यक्षमता को जोड़ना नहीं है (जो हास्केल नियंत्रित तरीके से करता है जैसे कि मोनड्स के माध्यम से, और जो बॉयलरप्लेट को कम करने में मदद करता है) बल्कि कुछ कोड की अनुमति देता है कुछ ऐसा करें जो करने की उम्मीद न हो। उदा: हास्केल में शुद्ध कार्य का कभी भी दुष्प्रभाव नहीं होगा। अवधि। कई अन्य भाषाओं में आप इसे फ़ंक्शन के दस्तावेज़ में वादा कर सकते हैं, लेकिन आपकी भाषा में कुछ भी आपको अपने कोड में कहीं-कहीं कुछ साइड-इफ़ेक्ट में झटकों से नहीं रोक पाएगा।
जियोर्जियो

33

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

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

क्या यह एक बाधा है? नहीं, मुझे लगता है कि यह एक संपत्ति है। IOउदाहरण के बिना हास्केल के आलस्य से निपटने के तरीके पर विचार करने का प्रयास करें ।


8
एक बार जब आप इसकी आदत डाल लेते हैं तो +1 हास्केल का टाइप सिस्टम आपका दोस्त हो सकता है।
लैरी कोलमैन

"ऐसा करने के लिए, आपको एक स्थिर प्रकार की प्रणाली की आवश्यकता है"। वास्तव में?
जॉन हैरोप

1
"C ++ और OCaml के प्रकार सिस्टम की तुलना में सभी अधिक दिलचस्प"। क्या आपने OCaml के प्रथम श्रेणी के उच्च-क्रम के मॉड्यूल और संरचनात्मक रूप से टाइप किए गए ऑब्जेक्ट सिस्टम और बहुरूपी प्रकारों का अध्ययन किया है?
जॉन हैरोप

2
@ जोनरोप या एक प्रभाव प्रणाली या शुद्धता को मापने / मूल्यांकन करने का कोई तरीका। हां, इसलिए उनकी तुलना करना दिलचस्प है। अलग-अलग भाषाओं के लिए अलग-अलग विकल्प हैं।
लोगन कैपल्डो

20

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

जब मैंने पहली बार हास्केल का उपयोग करना शुरू किया, तो मैंने इस प्रकार की प्रणाली को कष्टप्रद माना, और केवल इस प्रकार के हस्तक्षेप के कारण इसे सहन किया। मुझे जल्द ही पता चला कि कंपाइलर ने कई प्रकार की त्रुटियों के बारे में शिकायत की थी जो कि वैसे भी काम नहीं करता था, भले ही कंपाइलर ने उन्हें मुझे करने दिया हो (उदाहरण के लिए कॉनकैट मैप के बजाय गलती से मानचित्र का उपयोग कर रहा हो)। मैंने तब पता लगाया कि टाइप चेक पास करने वाले प्रोग्राम आमतौर पर सही थे, या कम से कम सही के करीब थे। मेरे पास एक आलसी चरण भी था, जहां मैंने एक फ़ंक्शन प्रकार को बदलकर और संकलक को यह बताकर किया था कि मुझे और क्या बदलने की आवश्यकता है। अंत में, मुझे एहसास हुआ कि हास्केल का प्रकार प्रणाली वास्तव में बहुत अभिव्यंजक था और मेरे कार्यक्रमों को प्रकारों के आसपास डिजाइन करना शुरू कर दिया। यह हास्केल का पवित्र कंघी बनानेवाले की रेती है।


एक और बात ध्यान दें: मैंने एक ही समय में योजना और हास्केल दोनों का उपयोग करके कार्यात्मक प्रोग्रामिंग सीखी (एक वर्ग के लिए पूर्व और मस्ती के लिए बाद वाली)। मैंने पाया कि स्कीम में एस और एस की तुलना में हास्केल के पैटर्न-मिलान के साथ पुनरावृत्ति को समझना बहुत आसान था , जो मुझे लगता है कि क्लोजर को भी वहन करता है। ifcond
तिखन जेल्विस

@ लॉरी कोलमैन: +1 ठीक प्रकार के सिस्टम के साथ अपने स्वयं के अनुभव का वर्णन करने के लिए: पहले C ++, फिर Ocaml, और अब मेरी अपनी भाषा फेलिक्स। हां, मैं अभी भी कंपाइलर त्रुटियों का पीछा करते हुए रिफ्लेक्टर करता हूं।
येट्रिल

8

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

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

प्रकार प्रणाली एक बड़ी बाधा नहीं होनी चाहिए। प्रोग्राम जो लोग गतिशील भाषाओं का उपयोग करते हुए भी करते हैं, टाइपिंग सम्मेलनों का पालन करते हैं जिन्हें हास्केल के प्रकार प्रणाली का उपयोग करके एन्कोड किया जा सकता है। हास्केल में सी ++ और जावा जैसी भाषाओं की तुलना में टाइप इंफ़ेक्शन भी होता है, जो शब्दशः को कम कर देता है। जब आपको एक त्रुटि संदेश मिलता है, तो संकलक आपको केवल संकलन समय पर बता रहा है कि गतिशील प्रकार वाली भाषा आपको रनटाइम पर क्या बताएगी।

एक गतिशील प्रकार प्रणाली के विपरीत एक स्थिर प्रकार प्रणाली है, एक मजबूत प्रकार प्रणाली नहीं। एक मजबूत प्रकार की प्रणाली एक कमजोर प्रकार की प्रणाली के विपरीत है।


1
उदाहरण के लिए, C वैधानिक है लेकिन कमजोर टाइप किया हुआ है। आपके पास प्रकार हैं, लेकिन टाइप-सिस्टम को पूरी तरह से अलग करना आसान है, अंतर्निहित मशीन-विशिष्ट अभ्यावेदन आदि के साथ खेलते हैं। कई गतिशील रूप से टाइप की गई भाषाएं OTOH काफी दृढ़ता से टाइप की जाती हैं - कुछ निहित जाति, कुछ तरीके (यदि कोई हो) तो टाइप सिस्टम को हटाने के लिए।
स्टीव 314

4

यह आपको सही समय बताता है जब आप गूंगा गलतियाँ करते हैं। यह मददगार है। मैं इस अंतिम समय में रैकेट (स्कीम) में काम कर रहा हूं, और कई बार ऐसा हुआ है, जहां मैंने एक अनपेक्षित एस-एक्सप पास किया है, जहां मुझे अपने दुभाषिया में कुछ फ़ंक्शन के लिए पार्स किए गए ast की उम्मीद थी, और यह केवल मेरे ऊपर दिखाई दिया मध्यम आकार का परीक्षण सूट। अगर मेरे पास कुछ स्थिर टाइपिंग होती, तो यह तुरंत मेरे ध्यान में लाया जाता।

बेशक, लॉजिक एरर को वास्तव में टाइप सिस्टम द्वारा नहीं पकड़ा जा सकता है, लेकिन आपके द्वारा स्क्रू करने के तरीकों की संख्या बहुत कम हो जाती है।

साथ ही, यदि आप चाहें तो टाइप इंफ़ेक्शन आपको टाइप सिस्टम को अनदेखा करने देता है। यह अभी भी वहां है, लेकिन इसे आपके हिस्से पर सक्रिय इनपुट की आवश्यकता नहीं है। यह अभी भी आपके कार्यों के प्रकारों को समझने में मददगार है, लेकिन सही कोड ठीक काम करेगा।

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


8
अगर आपको लगता है कि आप हास्केल के प्रकार प्रणाली को अनदेखा कर सकते हैं, तो मुझे लगता है कि आपने हास्केल को ज्यादा कोडित नहीं किया है।
एरिक विल्सन

इसे अनदेखा न करें क्योंकि इसे अनदेखा करें जितना फ़ंक्शन टाइप करें, इसे GHCi में लोड करें, और उस पर जाएं। लेकिन आपको अभी भी कभी-कभी कुछ InIngrgral या अन्य कार्यों में छिड़कने की आवश्यकता है।
थियो बेलैयर

1
Tyr, यहां तक ​​कि टाइप इंट्रेंस के साथ, हास्केल फ़ंक्शंस का उपयोग करने और कोडिंग करने का 90% एक दूसरे के साथ मेष करने के लिए शापित चीजें प्राप्त कर रहा है, जिसके लिए इसके प्रकार सिस्टम और आर्कैन टाइपेकिटिंग त्रुटि संदेशों की समझ की आवश्यकता होती है। यहां तक ​​कि ": t" एक जादुई समाधान नहीं है, बस यह समझने के लिए पहला कदम है कि कार्यक्रम को कैसे संकलित किया जाए।
एंड्रेस एफ।

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

2

एक "कार्यात्मक" भाषा होने के नाते, इसका मतलब है (अन्य चीजों के अलावा) जो कार्य भाषा में प्रथम श्रेणी की वस्तुएं हैं।

"शुद्ध" भाषा होने का मतलब है कि फ़ंक्शन गणितीय कार्य हैं (प्रक्रियाओं के विपरीत) - एक ही इनपुट को देखते हुए, वे हमेशा एक ही आउटपुट का उत्पादन करते हैं।

एक "शुद्ध कार्यात्मक भाषा" वह है जहाँ उपरोक्त दोनों को पकड़ लिया जाता है। मैं एक "pure- के बारे में पता नहीं कर रहा हूँ ly कार्यात्मक भाषा"।

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

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


0

हाँ, प्रकार प्रणाली एक अविश्वसनीय संपत्ति है। यहां तक ​​कि यह वर्णन करना बहुत मुश्किल होगा कि मोनाड कैसे काम करते हैं या कुछ कॉम्बिनेटर बिना टाइप सिस्टम के कैसे काम करते हैं। Haskell पर कितने ट्यूटोरियल पर विचार करें कि पहले आप REPL में a: t के साथ फ़ंक्शन के प्रकार पर विचार करें। यह एक गतिशील टाइप भाषा में आपके लिए उपलब्ध नहीं है। ज़रूर, टाइप सिस्टम की सारी जटिलता अभी भी है। एक सन्यासी अभी भी एक सन्यासी है। लेकिन भाषा ने इस मामले से हाथ धोने का फैसला किया है और किसी भी तरह की मदद नहीं दी है। आप अपने दम पर हैं, पाल। मैं गतिशील रूप से टाइप की हुई भाषाओं को नहीं मार रहा हूँ। मैं उन्हें बहुत प्यार करता हूं। योजना एक बिजली उपकरण है। लेकिन आप देखेंगे कि जब हम गतिशील भाषाओं में भिक्षुओं जैसी चीजों के बारे में बात करते हैं, तो हम अक्सर एक संकेतन का आविष्कार करते हैंप्रक्रियाओं के प्रकार का वर्णन करने के लिए। एक कार्यात्मक प्रोग्रामर एक तरह से या दूसरे के साथ लड़ाई करेगा। हास्केल का प्रकार चेकर आपको यह जानने के लिए अच्छा उपकरण देता है कि यह कैसे करना है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.