LISP और Haskell का उपयोग करने के क्या फायदे हैं? क्या वे मुझे एक बेहतर प्रोग्रामर बनाएंगे? [बन्द है]


41

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


36
LISP और Haskell का उपयोग करना आपको बेहतर LISP और Haskell प्रोग्रामर बना देगा, मैं इसकी गारंटी देता हूं।
नील

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

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

8
@MasonWheeler पूरी तरह से अच्छे कारण हैं कि एक भाषा बाकी की तुलना में अधिक उपयोगी हो सकती है, लेकिन अभी भी व्यापक रूप से उपयोग नहीं की जाती है। मैं कई के बारे में सोच सकता हूं: मौजूदा उपयोगकर्ता आधार, बहुत आमूलचूल परिवर्तन, जब "अच्छा काफी अच्छा है", और यह भी ... जब बेहतर टूल को प्रोग्रामर की आवश्यकता होती है जो अधिक औपचारिक रूप से प्रशिक्षित होते हैं। तो लोकप्रियता उपयोगिता का एक अच्छा उपाय नहीं है
एंड्रेस एफ।

5
@MasonWheeler एक सादृश्य का उपयोग करने के लिए, गणित वास्तविक जीवन में एक बेहद उपयोगी क्षेत्र है। तो क्यों गणित में अधिक लोग कुशल नहीं हैं? बहुत सारे लोग इससे क्यों डरते हैं, और लगता है कि यह काला जादू है और वास्तव में यह सब उपयोगी नहीं है?
एंड्रेस एफ।

जवाबों:


37

यह बहुत पसंद है गणित सीखना आपके विश्लेषणात्मक कौशल में सुधार करेगा और लैटिन / क्लासिक साहित्य सीखने से आपके लेखन कौशल में सुधार होगा।

जिन लोगों ने उन भाषाओं को डिज़ाइन किया है, उन्होंने इस बारे में कठिन सोचा है कि प्रोग्राम लिखने का क्या मतलब है। और वे भाषाएँ उन शोधों के परिणाम हैं।

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

संपादित करें

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

लिस्प

लिस्प का मानना ​​है कि सिंटैक्स न्यूनतम होना चाहिए, और यह कि सब कुछ एक सूची या एक आदिम होना चाहिए (लिस्प का अर्थ सूची प्रसंस्करण के लिए है)। यहां तक ​​कि कार्यक्रम मुख्य रूप से अन्य सूचियों और प्रतीकों वाली सूची है। लिस्प आपको सूची के रूप में कार्यक्रमों में हेरफेर करने और मक्खी पर नए कार्यक्रमों को उत्पन्न करने की अनुमति देता है। इसलिए पूरे code is data and data is codeआदर्श वाक्य।

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

(defroutes app-routes
  (GET "/" [] view/page)
  (GET "/api" [] (wrap-aleph-handler api/socket-handler))
  (route/resources "/static")
  (route/not-found "page not found"))

एक और अच्छा उदाहरण हिचकी templating ढांचे है:

(html [:ul
  (for [x (range 1 4)]
    [:li x])])

जैसा कि आप देख सकते हैं, परिणाम मूंछों की तरह डीएसएल के रूप में के समान है, लेकिन आपको भाषा जैसी सुविधाओं का उपयोग करने की अनुमति देता है (for [x (range 1 4)] block)। यहां तक ​​कि अच्छे, आपके पास अपने कोड को सार और संरचना करने के लिए सभी उपकरण हैं।

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

हास्केल

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

एक परिणाम यह है कि आप जब चाहें तब IO क्रिया नहीं कर सकते (हैकर्स का मानना ​​है कि यह एक अच्छी बात है)। IO क्रियाओं को लेन-देन के रूप में परिभाषित किया जाता है, जो स्वयं शुद्ध मान हैं। mainएक haskell कार्यक्रम के मूल्य एक आईओ लेनदेन निष्पादित जब आप प्रोग्राम चलाया जाता है।

आपको अपने कार्यक्रम में डेटा प्रवाह के साथ स्पष्ट रूप से निपटना होगा। आप एक वैश्विक चर में सामान लिखने और पढ़ने के द्वारा दो घटक संवाद नहीं कर सकते। आपको मूल्यों का निर्माण और पारित करना होगा।

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

length :: [a] -> Int (एक int की एक सूची से कार्य)

map :: (a -> b) -> [a] -> [b](फंक्शन जो a to bट्रांसफॉर्मेशन और ए की सूची लेता है , और बी की सूची लौटाता है)

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

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

या तो आप सुरक्षित रास्ता अपनाएं (जैसे कि scala) और वास्तव में जटिल भाषा के साथ समाप्त हो जाएं, या आप सरल रास्ता अपनाएं और ऐसा कुछ प्राप्त करें जो या तो सीमित हो (google go generics limited to list and Maps) या असुरक्षित (dart generics) जो हमेशा होती हैं covariant)।

हैस्केल का उपयोग करके, आप मुख्य रूप से शुद्धता के लाभों के बारे में सीखते हैं, और शुद्ध कोड कैसे लिखें।


1
@ जिमीहॉफ़ा मुझे लगता है कि वास्तव में इसके स्वयं के जवाब के हकदार हैं, क्योंकि यह वही है जो लोग अनदेखी करते हैं। कार्यात्मक प्रोग्रामिंग द्वारा सबसे अच्छी तरह से हल किए गए समस्या डोमेन हैं जो लोगों को तब तक महसूस नहीं करते हैं जब तक कि वे कम से कम उन डोमेन में अपने आराम क्षेत्र के बाहर dabbled न हों।
KChaloux

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

3
@KChaloux मैं उत्तर लिखूंगा लेकिन यह प्रश्न बंद होना चाहिए (मैंने तदनुसार मतदान किया)। सीधे शब्दों में कहूं तो मैं एक उत्तर में अपनी राय और अनुभव लिख सकता था, लेकिन यह अन्य उत्तरों की तुलना में अधिक सही या गलत नहीं होगा, जो समस्या है भाषा-अनुशंसा प्रश्न, और मैंने बंद करने के लिए मतदान क्यों किया।
जिम्मी हॉफ

7
OMG, @Neil यह जानकर कि कंप्यूटर वास्तव में सबसे अधिक आश्वस्त कर रहा है , आपको एक बेहतर प्रोग्रामर बना देगा। मैंने वर्षों में असेंबली नहीं लिखी है, लेकिन नियमित रूप से इसे पढ़ता हूं (प्लेटफार्मों के एक समूह में) और यदि आप इस बात की परवाह करते हैं कि आपका कार्यक्रम वास्तव में कैसे काम करता है, तो कम से कम मूल बातें जानना महत्वपूर्ण है।
डैश-टॉम-बैंग

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

12

tl; dr सीखना नया सामान केवल आपको एक बेहतर प्रोग्रामर बना सकता है, लेकिन बेहतर प्रोग्रामर होने के नाते उन भाषाओं के बारे में नहीं है जिन्हें आप कोड लिख सकते हैं।

LISP और Haskell का उपयोग करने के क्या फायदे हैं?

लिस्प:

  1. होमोसेक्सुअल कोड। यह संरचित स्व-संशोधित कोड की अनुमति देता है।
  2. सिंटेक्स-जागरूक मैक्रोज़। वे बॉयलरप्लेट कोड के पुनर्लेखन की अनुमति देते हैं।
  3. व्यावहारिकता। सीएल को काम करने वाले पेशेवरों द्वारा सामान प्राप्त करने के लिए बनाया गया है। एक नियम के रूप में, अधिकांश कार्यात्मक भाषाएं नहीं हैं।
  4. लचीलापन। यह उचित गति से बहुत सारे अलग-अलग काम कर सकता है।
  5. Wartiness। असली दुनिया गड़बड़ है। व्यावहारिक कोडिंग हवाएं या तो गंदे निर्माणों का उपयोग या आविष्कार करने के लिए होती हैं। आम लिस्प में पर्याप्त मस्सा होता है जिससे यह काम कर सकता है।

संभवतः सीएल के खिलाफ चुनने का एकमात्र वास्तविक कारण यह है कि मानक पुस्तकालय दिनांकित हैं।

मैं एक अंग पर निकलूंगा और कहूंगा कि सामान्य स्थिति में, वाक्यविन्यास एक पेशेवर सॉफ्टवेयर कार्यकर्ता के लिए एक मुद्दा नहीं होना चाहिए।

से: लिस्प उपयोगी क्यों है?

हास्केल:

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

आप वहाँ कार्यात्मक बनाम अनिवार्य का विवरण पढ़ सकते हैं

प्रेषक: http://www.haskell.org/haskellwiki/Introduction

क्या वे मुझे एक बेहतर प्रोग्रामर बनाएंगे?

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

एक एकल उपकरण, एक एकल पुस्तक, एक एकल प्रोग्रामिंग प्रतिमान नहीं है जो आपको एक बेहतर प्रोग्रामर बना देगा।

विभिन्न प्रतिमानों के साथ विभिन्न प्रोग्रामिंग भाषाओं को सीखना निश्चित रूप से आपको एक बेहतर प्रोग्रामर बनने में मदद करता है, विभिन्न aproaches के साथ समस्याओं को हल करने के लिए सीखने से भी आपकी तार्किक सोच को बहुत फायदा होता है।

एक अच्छा प्रोग्रामर होना भाषा के बारे में ज्यादा नहीं है, बल्कि किसी भी भाषा में किसी भी समस्या को हल करने की क्षमता के बारे में है। और जब आप भाषा नहीं जानते हैं, तो उस भाषा को जल्दी से सीखने और प्रभावी ढंग से उपयोग करने की क्षमता।

मुझे लगता है, कि आपकी सोच जितनी अधिक वैश्विक है, आप उतने ही बेहतर डेवलपर हैं।

उदाहरण के लिए, आप अपने कोड में उपयोगी टिप्पणी जोड़ सकते हैं, अपने कोड की पठनीयता, रख-रखाव की परवाह कर सकते हैं। छोटे विवरणों पर ध्यान दें। टाइप करने से पहले सोचें !. डेसिंग पैटर्न के बारे में जानें। अच्छी प्रथाओं का पालन करें।

प्रकटीकरण: यह सबसे खराब तरह का बेशर्म विज्ञापन है, क्योंकि यह मेरे ब्लॉग से है।


4
क्या आपने LISP या हास्केल को किसी सक्षम स्तर पर सीखा है?
जिम्मी होफा

10
किसी ऐसे व्यक्ति से यह सुनना थोड़ा अपमानजनक है जो किसी भी भाषा के पास नहीं जानता है। आप दावा करते हैं कि वे ऐसे उपकरण नहीं हैं जिनकी आपको अभी आवश्यकता है, लेकिन आपको पता नहीं है कि वे कौन से उपकरण हैं, इसलिए आप यह कैसे जान सकते हैं? इसके अलावा आप किसी को कैसे सलाह दे सकते हैं कि वे क्या करेंगे या उनसे नहीं सीखेंगे, जहां तक ​​आप जानते हैं कि LISP एक SQL व्युत्पन्न है जो केवल संबंधपरक डेटा विश्लेषण में उपयोगी है और Haskell Regexp का एक सख्त उपसमुच्चय हो सकता है।
जिमी हॉफ

10
यह वास्तव में इस सवाल का जवाब नहीं देता है। आप उन दो भाषाओं के बारे में एक सामान्य जवाब देने की प्रभावशाली उपलब्धि पर सफल रहे जिन्हें आप नहीं जानते: /
एंड्रेस एफ।

2
-1 क्योंकि यह आम तौर पर नाचता है कि आम लिस्प और हास्केल आपको क्या सिखाते हैं। उदाहरण: कोड के रूप में डेटा डेटा के रूप में कोड, शुद्धता, संदर्भात्मक पारदर्शिता, मोनडिक अमूर्तताएं, कार्यात्मक प्रोग्रामिंग, भाषा उन्मुख प्रोग्रामिंग, टाइप निर्देशित प्रोग्रामिंग, आदि
21

3
इसके अलावा किसी भी भाषा को न जानकर मुझे नहीं लगता कि आप उस प्रश्न का उत्तर दे सकते हैं: क्षमा करें
jozefg

9

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

यह कहा जा रहा है, यह भाषाओं तक सीमित नहीं है। जब आप विभिन्न डेटा संरचनाओं पर पढ़ते हैं, जिन्हें आपने पहले नहीं देखा या उपयोग नहीं किया है, तो यह आपके ज्ञान के दायरे को व्यापक बनाने में मदद कर सकता है इसलिए अगली बार जब आप एक समस्या का सामना करते हैं तो आपके पास एक और संभावित समाधान होगा।

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