अधिकांश नियमित प्रोग्रामिंग कार्यों के लिए हास्केल की उन्नत अवधारणाएं जैसे मोनाड्स और एपेक्टिव फ़ंक्शंस कितने महत्वपूर्ण हैं?


16

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

लेकिन मैं वास्तव में कोशिश करना चाहता हूं।

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

क्या यह हास्केल का उपयोग करना सीखने का एक उचित तरीका है?


2
मुझे नहीं पता कि आपको कितनी दूर मिलेगी। मोनाड्स के बिना आप हास्केल में कुछ भी उपयोगी नहीं कर सकते हैं, क्योंकि प्रोग्रामिंग में उपयोगी कुछ भी करना (जैसे, एक गंभीर कार्यक्रम जिसे कोई व्यक्ति वास्तव में उपयोग करना चाहेगा) को I / O और राज्य की आवश्यकता होती है, दोनों को केवल Haskell में प्रबंधित किया जा सकता है। भिक्षुओं के उपयोग के माध्यम से।
मेसन व्हीलर

1
@dan - मैंने अंत में हास्सेल मोनड्स को दो दस्तावेजों को पढ़ने से समझा - "आप मोनाड्स का आविष्कार कर सकते थे" और "टैक्लिंग द अवेकवर्ड स्क्वाड"। मैं यह नहीं कह सकता कि क्या वे "लर्न यू ए हास्केल" से बेहतर हैं, जो मैंने नहीं पढ़ा, लेकिन उन्होंने मेरे लिए काम किया। IO मोनाद के साथ do notation का उपयोग करने के लिए, आप बहुत कम समझ के साथ प्राप्त कर सकते हैं कि सन्यासी क्या हैं - आप कुछ ऐसे काम करेंगे जिससे विशेषज्ञ या तो हँसेंगे या रोएँगे, लेकिन सतही तौर पर कम से कम, यह उपयोग करने से बहुत अलग नहीं है एक पारंपरिक अनिवार्य भाषा। लेकिन यह है कुछ गहरी समझ हो रही सार्थक।
स्टीव ३४

2
@dan, मुझे OOP से ऊबने और कार्यात्मक भाषाओं के बारे में जानने / उत्सुक होने में लगभग एक दशक लग गया। हास्केल को एक गंभीर प्रयास देने से पहले मैं अभी भी एफ # और क्लोजर सीखूंगा। हालांकि व्यक्तिगत चुनौतियां अच्छी हैं, लेकिन आपकी आंत की भावना और कम से कम प्रतिरोध के रास्ते के बारे में कुछ कहा जाना चाहिए। बहुत कुछ इस बात पर निर्भर करता है कि आप कौन हैं। यदि आप एक दृढ़ता से मैथी प्रकार हैं, तो आप शुरू से ही हास्केल / स्कीमों को पसंद करेंगे। यदि आप एक 'काम करवाने वाले व्यक्ति' के अधिक हैं, तो यह भी ठीक है। हास्केल को 'करो या मरो' वाले रवैये के साथ न देखें। अन्य चीजों को जानें, और जब ऊब वापस आएँ।
जॉब

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

@dan, फनी, मुझे क्लोजर का वाक्यविन्यास अनुकूल लगता है, लेकिन ऐसा शायद इसलिए है क्योंकि मुझे इससे पहले स्कीम के बारे में पता चला था। हो सकता है कि F # के बाद मुझे Haskell के काम करने के तरीके की आदत हो जाएगी।
जॉब

जवाबों:


16

आइए पहले अमूर्त अवधारणाओं को सीखने और उनमें से विशिष्ट उदाहरणों को सीखने के बीच अंतर करें।

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

दूसरी ओर, स्वयं सार, निश्चित रूप से उपयोगी हैं , लेकिन वे तुरंत आवश्यक नहीं हैं। आप पूरी तरह से और सीधे सीधे विभिन्न प्रकारों का उपयोग करते हुए बहुत दूर तक की अनदेखी कर सकते हैं। आप उन्हें अंततः समझना चाहते हैं, लेकिन आप हमेशा बाद में वापस आ सकते हैं। वास्तव में, मैं लगभग गारंटी दे सकता हूं कि यदि आप ऐसा करते हैं, तो जब आप इसे वापस करते हैं तो आप अपने माथे को थप्पड़ मारेंगे और आश्चर्य करेंगे कि आपने सुविधाजनक सामान्य-प्रयोजन साधनों का उपयोग करने के बजाय चीजों को कठिन तरीके से करने में अपना सारा समय क्यों लगाया।

Maybe aएक उदाहरण के रूप में लें । यह सिर्फ एक डेटा प्रकार है:

data Maybe a = Just a | Nothing

यह सब लेकिन स्व-दस्तावेजीकरण है; यह एक वैकल्पिक मूल्य है। या तो आपके पास कुछ प्रकार का "बस" है a, या आपके पास कुछ भी नहीं है। मान लें कि आपके पास किसी प्रकार का एक लुकअप फ़ंक्शन है, जो Maybe Stringकिसी ऐसे Stringमान को दर्शाने के लिए लौटाता है जो मौजूद नहीं हो सकता है। तो आप यह देखने के लिए कि यह कौन सा है:

case lookupFunc key of
    Just val -> ...
    Nothing  -> ...

बस इतना ही!

वास्तव में, आपको और कुछ नहीं चाहिए। कोई Functors या Monadरों या कुछ और। वे Maybe aमूल्यों का उपयोग करने के सामान्य तरीके व्यक्त करते हैं ... लेकिन वे सिर्फ मुहावरे हैं, "डिजाइन पैटर्न", जो भी आप इसे कॉल करना चाहते हैं।

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

वास्तव में, यहाँ आप सभी के लिए एक धोखा पत्र वास्तव में IOअब के बारे में जानने की जरूरत है :

  • यदि किसी चीज़ का प्रकार है IO a, तो इसका मतलब है कि यह एक ऐसी प्रक्रिया है जो कुछ करती है और एक aमूल्य निकालती है ।

  • जब आपके पास doनोटेशन का उपयोग करके कोड का एक ब्लॉक होता है, तो कुछ इस तरह से लिखना:

    do -- ...
       inp <- getLine
       -- etc...
    

    ... का अर्थ है प्रक्रिया को दाईं ओर निष्पादित करना<- , और परिणाम को बाईं ओर नाम निर्दिष्ट करना।

  • जबकि अगर आपके पास ऐसा कुछ है:

    do -- ...
       let x = [foo, bar]
       -- etc...
    

    ... इसका अर्थ है बाईं ओर के =नाम के दाईं ओर सादे अभिव्यक्ति (एक प्रक्रिया नहीं) के मूल्य को निर्दिष्ट करना ।

  • यदि आप इस तरह से एक मूल्य बताए बिना कुछ डालते हैं, जैसे:

    do putStrLn "blah blah, fishcakes"
    

    ... इसका मतलब है कि एक प्रक्रिया को निष्पादित करना और कुछ भी इसे अनदेखा करना। कुछ प्रक्रियाओं के प्रकार होते हैं IO ()- ()प्रकार एक प्लेसहोल्डर की तरह होता है जो कुछ भी नहीं कहता है, इसलिए इसका मतलब है कि प्रक्रिया कुछ करती है और एक मूल्य वापस नहीं करती है। voidअन्य भाषाओं में एक फ़ंक्शन की तरह ।

  • एक ही प्रक्रिया को एक से अधिक बार निष्पादित करना अलग परिणाम दे सकता है; इस तरह का विचार है। यही कारण है कि IOमूल्य से "हटाने" का कोई तरीका नहीं है , क्योंकि कुछ IOमूल्य नहीं है, यह एक मूल्य प्राप्त करने की एक प्रक्रिया है।

  • किसी doब्लॉक में अंतिम पंक्ति बिना किसी असाइनमेंट के एक सादे प्रक्रिया होनी चाहिए, जहां उस प्रक्रिया का रिटर्न मान पूरे ब्लॉक के लिए रिटर्न वैल्यू बन जाता है। यदि आप चाहते हैं कि रिटर्न वैल्यू पहले से ही दिए गए कुछ मूल्य का उपयोग करें, तो returnफ़ंक्शन एक सादा मूल्य लेता है और आपको एक नो-ऑप प्रक्रिया देता है जो उस मूल्य को वापस करता है।

  • इसके अलावा, वहाँ के बारे में कुछ खास नहीं है IO; ये प्रक्रियाएं वास्तव में स्वयं सादा मूल्य हैं, और आप उन्हें चारों ओर से गुजर सकते हैं और उन्हें विभिन्न तरीकों से जोड़ सकते हैं। यह केवल तभी होता है जब उन्हें एक doब्लॉक में निष्पादित किया जाता है जिसे कहीं न कहीं mainवे कहते हैं कि वे कुछ भी करते हैं।

तो, कुछ इस तरह से उबाऊ, टकसाली उदाहरण कार्यक्रम:

hello = do putStrLn "What's your name?"
           name <- getLine
           let msg = "Hi, " ++ name ++ "!"
           putStrLn msg
           return name

... आप इसे एक अनिवार्य कार्यक्रम की तरह पढ़ सकते हैं। हम नाम की एक प्रक्रिया को परिभाषित कर रहे हैं hello। जब निष्पादित किया जाता है, तो पहले यह आपके नाम से पूछते हुए एक संदेश मुद्रित करने के लिए एक प्रक्रिया निष्पादित करता है; इसके बाद यह एक प्रक्रिया निष्पादित करता है जो इनपुट की एक पंक्ति को पढ़ता है, और परिणाम को असाइन करता है name; तब यह नाम को एक अभिव्यक्ति प्रदान करता है msg; तब यह संदेश प्रिंट करता है; फिर यह पूरे ब्लॉक के परिणाम के रूप में उपयोगकर्ता का नाम लौटाता है। चूंकि nameए है String, इसका मतलब यह है कि helloप्रक्रिया एक है जो रिटर्न करती है String, इसलिए इसका प्रकार है IO String। और अब आप इस प्रक्रिया को कहीं और निष्पादित कर सकते हैं, जैसे यह निष्पादित करता है getLine

पफ, मोनाड्स। उन्हें कौन चाहिए?


2
@dan: आपका बहुत बहुत स्वागत है! यदि आपके पास स्टैक ओवरफ्लो पर पूछने में संकोच न करें, तो आपके पास कोई विशिष्ट प्रश्न हैं। [हैस्केल] टैग आमतौर पर बहुत सक्रिय है, और यदि आप समझाते हैं कि आप लोगों से कहाँ आ रहे हैं, तो बहुत ही अच्छे तरीके से समझने में आपकी मदद करने के बजाय केवल क्रिप्टोकरेंसी का जवाब देना है।
सीए मैक्कैन

9

अधिकांश नियमित प्रोग्रामिंग कार्यों के लिए हास्केल की उन्नत अवधारणाएं जैसे मोनाड्स और एपेक्टिव फ़ंक्शंस कितने महत्वपूर्ण हैं?

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

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


1
+1: यह इंगित करने के लिए धन्यवाद कि "मोनाड्स, मोनाड ट्रांसफ़ॉर्म, मोनॉयड्स, फ़ंक्शंस, एपेरेटिव फ़ंक्शंस, कॉन्ट्रैवारिएंट फ़ंक्शंस, एरो, कैटेगरी, आदि डिज़ाइन पैटर्न हैं।" !
जियोर्जियो

7

क्या यह कड़ाई से आवश्यक है यदि आप बस कुछ चलाना चाहते हैं? नहीं।

यदि आप सुंदर मुहावरेदार हस्केल कार्यक्रम लिखना चाहते हैं तो क्या यह आवश्यक है? पूर्ण रूप से।

हास्केल में प्रोग्रामिंग करते समय यह दो चीजों को ध्यान में रखने में मदद करता है:

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

  2. विभिन्न उपलब्ध पुस्तकालय # 1 सिद्धांत का उपयोग करके विकसित किए गए थे।

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

बदसूरत हास्केल लिखना संभव है कि बस कुछ चल रहा है। लेकिन जब आप उस चरण में पहुँच जाते हैं, तो सीखने के लिए बहुत कुछ होता है।

सौभाग्य!


1
धन्यवाद! मैं क्लोजर और हास्केल के बीच में डगमगा रहा हूं, लेकिन अब आप जैसे लोगों की मदद करने के कारण मैं हास्केल की ओर झुक रहा हूं।
डैन

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