हास्केल, लिस्प और वर्बोसिटी [बंद]


104

हास्केल और लिस्प के कुछ स्वाद दोनों में आप में से जो अनुभव करते हैं, उनके लिए मैं उत्सुक हूं कि "सुखद" (एक भयावह शब्द का उपयोग करने के लिए) यह हास्केल बनाम लिस्प में कोड लिखना है।

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

मुझे हास्केल अविश्वसनीय रूप से दिलचस्प लग रहा है , क्योंकि यह मुझे उन कोडिंग के तरीकों से परिचित करा रहा है जो मुझे पता नहीं था। इसमें निश्चित रूप से कुछ पहलू हैं जो ऐसा लगता है कि वे चपलता प्राप्त करने में सहायता करेंगे, जैसे कि आंशिक कार्यों को लिखने में आसानी। हालाँकि, मैं लिस्प मैक्रोज़ को खोने के बारे में थोड़ा चिंतित हूं (मुझे लगता है कि मैं उन्हें खो देता हूं; सच कहा जाए तो हो सकता है कि मैं अभी उनके बारे में नहीं जानता?) और स्टेटिक टाइपिंग सिस्टम।

क्या कोई भी व्यक्ति जिसने दोनों दुनियाओं में कोडिंग की एक सभ्य मात्रा में काम किया है, इस पर टिप्पणी करता है कि अनुभव कैसे भिन्न होते हैं, जिसे आप पसंद करते हैं, और अगर वरीयता वरीयता है?

जवाबों:


69

संक्षिप्त जवाब:

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

[नोट: एक " टेम्पलेट हास्केल " है जो आपको लिस्प के रूप में मैक्रोज़ लिखने की सुविधा देता है, लेकिन कड़ाई से बोलते हुए आपको इसकी आवश्यकता कभी नहीं होगी ।]


15
डॉन स्टीवर्ट के हवाले से कोनोर मैकब्राइड ने लिखा है : 'मुझे अपने गुरुत्व पर वार करने के प्रकारों के बारे में सोचना पसंद है, ताकि जिस दिशा में हमें यात्रा करनी पड़े [सही प्रोग्राम लिखने के लिए] वह "डाउनहिल" हो जाए।' टाइप सिस्टम सही प्रोग्राम लिखने के लिए आश्चर्यजनक रूप से आसान बनाता है ... इस पोस्ट और इसके पुनः शेयरों को देखें।
श्रीवत्सआर

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

@mljrg क्या आपके पास एक ठोस उदाहरण है? नीचे Hibou57 के उत्तर पर टिप्पणियों को देखें जहां एक कथित उदाहरण संदिग्ध निकला। मुझे आपकी तरह की वस्तु (जैसे हास्केल कोड के साथ और मैक्रोज़ के बिना) जानने में दिलचस्पी होगी।
श्रीवत्सआर

4
हास्केल से करी को बाहर निकाल लें। क्या आप इसे हास्केल में छोड़ दिया जाएगा। एक और उदाहरण: मान लीजिए कि हास्केल पैटर्न मिलान का समर्थन नहीं करता है, तो क्या आप इसे समर्थन करने के लिए जीएचसी के डेवलपर्स के लिए बिना खुद को जोड़ सकते हैं? सीएल में, आप भाषा का विस्तार करने के लिए मैक्रोज़ का उपयोग कर सकते हैं। मुझे लगता है कि सीएल भाषा 90 के दशक में अपने मानक वापस आने के बाद से नहीं बदली, जबकि हास्केल को जीएचसी में एक्सटेंशन का कभी न खत्म होने वाला प्रवाह लगता है।
mljrg

64

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

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

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

मैं व्यक्तिगत रूप से प्रोग्रामिंग के लिस्प तरीके को सामान्य रूप से पसंद करता हूं, क्योंकि मुझे लगता है कि यह मेरे काम करने के तरीके को फिट करता है। हालांकि, इसका मतलब यह नहीं है कि आप ऐसा करने के लिए बाध्य हैं।


4
क्या आप "हास्केल में प्रोग्रामिंग बहुत कम संवादात्मक है" पर थोड़ा और विस्तृत कर सकते हैं। क्या GHCi वास्तव में आपकी ज़रूरत की हर चीज़ मुहैया नहीं कराता है?
जोहान्स गेरर

3
@JohannesGerer: मैंने इसे आज़माया नहीं है, लेकिन जहाँ तक मैंने पढ़ा है, जीएचसीआई चल रही छवि में एक खोल नहीं है, जहाँ आप पूरे कार्यक्रम के मनमाने भागों को फिर से परिभाषित और विस्तारित कर सकते हैं, जबकि यह चल रहा है। इसके अलावा, हास्केल सिंटैक्स उत्तर और संपादक के बीच कार्यक्रम के टुकड़ों को प्रोग्रामेटिक रूप से कॉपी करना बहुत कठिन बनाता है।
Svante

13

आम लिस्प की तुलना में हास्केल में मेटाप्रोग्रामिंग की बहुत कम आवश्यकता होती है क्योंकि बहुत से मोनैड्स के आसपास संरचित किया जा सकता है और जोड़ा गया सिंटैक्स एम्बेडेड डीएसएल को कम पेड़ जैसा दिखता है, लेकिन हमेशा टेम्पलेट हास्केल, जैसा कि श्रीवत्सआर द्वारा उल्लेख किया गया है , और यहां तक ​​कि लिस्केल (हास्केल शब्दार्थ + लिस्प) सिंटैक्स) यदि आपको कोष्ठक पसंद है।


1
लिस्केल लिंक मर चुका है, लेकिन इन दिनों हैकेट है
विल नेस

10

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

उदाहरण का मामला जहां दोनों तर्कों के मूल्यांकन से बचने के लिए एक LISP मैक्रो की आवश्यकता होती है:

(defmacro doif (x y) `(if ,x ,y))

उदाहरण का मामला जहां हास्केल व्यवस्थित रूप से दोनों तर्क का मूल्यांकन नहीं करता है, मैक्रो परिभाषा जैसी किसी चीज की आवश्यकता के बिना:

doif x y = if x then (Just y) else Nothing

और वॉयला


17
यह एक सामान्य गलत धारणा है। हां, हास्केल आलस में इसका मतलब है कि जब आपको अभिव्यक्ति के कुछ हिस्सों का मूल्यांकन करने से बचना है, तो आपको मैक्रोज़ की आवश्यकता नहीं है, लेकिन वे सभी मैक्रो उपयोगों में से केवल सबसे तुच्छ उपसमुच्चय हैं। Google ने "द स्वाइन बिफोर पर्ल" के लिए एक मैक्रो प्रदर्शित करने वाली बात के लिए जो आलस्य के साथ नहीं किया जा सकता है। इसके अलावा, यदि आप चाहते हैं कि कुछ सख्त हो, तो आप ऐसा नहीं कर सकते हैं कि एक फ़ंक्शन के रूप में - इस तथ्य को प्रतिबिंबित करें कि योजना delayएक फ़ंक्शन नहीं हो सकती है।
एली बरज़िले

8
@ एली बरज़िले: मुझे यह उदाहरण बहुत पक्का नहीं लगता। यहाँ स्लाइड 40 का एक पूर्ण, सरल हास्केल अनुवाद है: pastebin.com/8rFYwTrE
रीड बार्टन

5
@ एली बरज़िले: मैं आपकी प्रतिक्रिया को बिल्कुल नहीं समझता। accept है (ई) डीएसएल। acceptसमारोह मैक्रो पिछले पन्नों पर उल्लिखित के अनुरूप है, और की परिभाषा vबिल्कुल की परिभाषा के समानांतर है vहास्केल और योजना कार्यों की गणना स्लाइड 40. पर योजना में एक ही मूल्यांकन की रणनीति के साथ एक ही बात। सबसे अच्छे रूप में, मैक्रो आपको अपने प्रोग्राम की संरचना को ऑप्टिमाइज़र में अधिक से अधिक उजागर करने की अनुमति देता है। आप शायद ही इसे एक उदाहरण के रूप में दावा कर सकते हैं जहां मैक्रोज़ एक तरह से भाषा की अभिव्यंजक शक्ति को बढ़ाते हैं और आलसी मूल्यांकन द्वारा दोहराया नहीं जाता है।
बार्टन

5
@ एली बरज़िले: एक काल्पनिक आलसी योजना में, आप इसे लिख सकते हैं: pastebin.com/TN3F8VVE मेरा सामान्य दावा है कि यह मैक्रो आपको बहुत कम खरीदता है : आशावादी के लिए थोड़ा अलग वाक्यविन्यास और एक आसान समय (लेकिन इससे कोई फर्क नहीं पड़ता) "पर्याप्त रूप से स्मार्ट कंपाइलर")। बदले में, आपने खुद को एक अनुभवहीन भाषा में फंसा लिया है; आप उन सभी को सूचीबद्ध किए बिना किसी भी पत्र से मेल खाने वाले ऑटोमेटन को कैसे परिभाषित करते हैं? इसके अलावा, मुझे नहीं पता कि "सभी उप-सूचियों में इसका उपयोग करने" या "अपने स्वयं के दायरे के साथ आवश्यक उपयोग" का मतलब क्या है।
बर्टन

15
ठीक है मैं हार मानता हूँ। जाहिर है डीएसएल की अपनी परिभाषा और इसलिए मेरे आलसी योजना उदाहरण एक डीएसएल नहीं है "किसी मैक्रो को तर्क", मूल करने के लिए वाक्य रचना isomorphic जा रहा है (के बावजूद है automatonबनता जा रहा letrec, :बनने accept, ->इस संस्करण में कुछ भी नहीं बनने)। जो कुछ।
बार्टन

9

मैं एक आम लिस्प प्रोग्रामर हूं।

कुछ समय पहले हास्केल ने कोशिश की थी कि मेरी व्यक्तिगत नीचे की रेखा सीएल के साथ चिपकी रहे।

कारण:

हास्केल के पास निश्चित रूप से अपनी योग्यता है और कुछ चीजों को मौलिक रूप से अलग तरीके से करता है, लेकिन यह सिर्फ मेरे लिए लंबे समय में कटौती नहीं करता है।


अरे, क्या आपको उस कॉस्टेनज़ा पेपर का शीर्षक मिला है जिससे आप जुड़े हैं? ऐसा लगता है कि फ़ाइल स्थानांतरित कर दी गई थी।
मचिगाक

2
ध्यान दें कि haskell भी उपसर्ग सिंटैक्स का समर्थन करता है, लेकिन मैं कहूंगा कि monad >> = इसका उपयोग करना बहुत बदसूरत होगा। इसके अलावा, मैं अशुद्धता के साथ एक आशीर्वाद होने से असहमत हूं: पी
वैकल्पिक

2
मुझे यह साइड-नोट पसंद है: हमने अभी तक अनुभवजन्य डेटा एकत्र नहीं किया है कि क्या यह मुद्दा वास्तविक दुनिया के कार्यक्रमों में गंभीर समस्याएं पैदा करता है।
जेरोम बॉम

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

11
वह कागज वास्तव में हास्केल के लिए लगभग पूरी तरह अप्रासंगिक है। " dilbert = dogbert.hire(dilbert);" ?? मुझे शक है कि बहुत से हास्केल प्रोग्रामर भी इसे बिना कुछ बताए पढ़ सकते हैं।
लेफ्टरनैबाउट

6

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


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

7
(डिफैमरो doif (xy) `(यदि, x, y))
जोशुआ गाल

4
एक मैक्रो एक फ़ंक्शन के समान नहीं है - मैक्रोज़ उच्च-क्रम के कार्यों के साथ अच्छी तरह से काम नहीं करते हैं fold, उदाहरण के लिए, जबकि गैर-सख्त कार्य करते हैं
तिखन जेल्विस

5

वास्तव में ठंडी चीजें हैं जो आप मैस्क्रोस के साथ लिस्प में प्राप्त कर सकते हैं जो हास्केल में बोझिल हैं (यदि संभव हो तो)। उदाहरण के लिए `मेमोइज़ 'मैक्रो लें (पीटर नॉरविग के PAIP का अध्याय 9 देखें)। इसके साथ, आप एक फ़ंक्शन को परिभाषित कर सकते हैं, फू कह सकते हैं, और फिर बस मूल्यांकन कर सकते हैं ('फू' को याद कर सकते हैं), जो मेमो संस्करण के साथ फू की वैश्विक परिभाषा को बदल देता है। क्या आप उच्च-क्रम के कार्यों के साथ हास्केल में समान प्रभाव प्राप्त कर सकते हैं?


3
काफी (AFAIK) नहीं है, लेकिन आप फ़ंक्शन को संशोधित करके (इसे पुनरावर्ती मानकर) कुछ ऐसा ही कर सकते हैं, ताकि फ़ंक्शन को एक पैरामीटर के रूप में पुनरावर्ती रूप से कॉल करने के लिए (केवल!) के बजाय केवल नाम से ही कॉल किया जा सके: haskell.org/hahaellwiki/Memoization
j_random_hacker

6
आप एक आलसी डेटा-संरचना में फू जोड़ सकते हैं, जहां एक बार गणना करने पर मूल्य संग्रहीत किया जाएगा। यह प्रभावी रूप से समान होगा।
थियो बेलियार

हास्केल संकलक द्वारा डिफ़ॉल्ट रूप से आवश्यक होने पर हास्केल में सब कुछ याद किया जाता है और संभवतः इनलेट किया जाता है।
aoeu256

4

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

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