haskell - हैस्केल के बाद कौन-सी भाषा सीखी जाए?




programming-languages (12)

मैं प्रोग्रामिंग के अपने ज्ञान को विस्तारित करना चाहता हूं। (...) मैंने सोचा था कि मैं जिस भाषा की तलाश में हूं, उसके बारे में कई शर्तों के साथ, मैं यहां प्रश्न पूछूंगा। कुछ व्यक्तिपरक हैं, कुछ का उद्देश्य हैस्केल से संक्रमण को कम करना है।

मजबूत प्रकार प्रणाली। (...) यह मेरे कार्यक्रम की शुद्धता के बारे में अनौपचारिक तर्क भी बनाता है। मैं शुद्धता से चिंतित हूं, दक्षता नहीं।

पुनरावृत्ति के बजाय रिकर्सन पर जोर। (...)

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

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

  • अनियंत्रित प्रकार, अधिक जादू जोड़ें : यदि हास्केल जादूगर है, लिस्प सृजन का कच्चा, प्रारंभिक जादू है। लिस्प-पारिवारिक भाषाओं ( योजना और क्लोजर समेत) में चरम minimalism के साथ लगभग अद्वितीय लचीलापन है। भाषाओं में अनिवार्य रूप से कोई वाक्यविन्यास नहीं है, सीधे पेड़ डेटा संरचना के रूप में कोड लिखना; लिस्प में मेटाप्रोग्रामिंग कुछ भाषाओं में गैर-मेटा प्रोग्रामिंग से आसान है।

  • थोड़ी समझौता करें और मुख्यधारा के करीब चले जाएं : हास्केल एमएल द्वारा भारी प्रभावित भाषाओं के व्यापक परिवार में पड़ता है, जिसमें से आप शायद बहुत अधिक कठिनाई के बिना स्थानांतरित कर सकते हैं। हास्केल सबसे सख्त है जब यह प्रकारों और कार्यात्मक शैली के उपयोग से शुद्धता गारंटी की बात आती है, जहां अन्य अक्सर संकर शैलियों और / या विभिन्न कारणों से व्यावहारिक समझौता करते हैं। यदि आप ओओपी के कुछ एक्सपोजर और मुख्यधारा के प्रौद्योगिकी प्लेटफार्मों तक पहुंच चाहते हैं, तो जावा और .NET प्लेटफार्मों के साथ आसान इंटरऑपरेबिलिटी प्रदान करते समय या तो .NET पर JVM या F # पर स्कैला बहुत सामान्य है। एफ # को माइक्रोसॉफ्ट द्वारा सीधे समर्थित किया गया है, लेकिन गैर-विंडोज प्लेटफ़ॉर्म पर हास्केल और पोर्टेबिलिटी समस्याओं की तुलना में कुछ परेशान सीमाएं हैं। स्कैला के पास हास्केल के प्रकार की प्रणाली और जावा की क्रॉस-प्लेटफार्म क्षमता के लिए सीधे समकक्ष हैं, लेकिन इसमें अधिक हेवीवेट सिंटैक्स है और इसमें शक्तिशाली प्रथम-पक्ष समर्थन की कमी है जो F # आनंद लेता है।

इनमें से अधिकतर सिफारिशों का भी अन्य उत्तरों में उल्लेख किया गया है, लेकिन उम्मीद है कि उनके लिए मेरा तर्क कुछ ज्ञान प्रदान करता है।

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

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

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

जवाबों का वजन : ये निश्चित रूप से नोट्स हैं। मैं बस उन सभी को जवाब देना चाहूंगा जिन्होंने अच्छी तरह से गठित प्रतिक्रियाएं दीं। आप बहुत मददगार रहे।

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

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

3) तीसरा, प्रोलॉग। प्रोलॉग में दिलचस्प सामग्री का भरपूर धन है, और इसका प्राथमिक डोमेन बिल्कुल वही है जिसमें मुझे रूचि है। इसमें एक सरल वाक्यविन्यास है और इसे पढ़ने में आसान है। मैं इस समय और अधिक टिप्पणी नहीं कर सकता, लेकिन प्रोलॉग के एक सिंहावलोकन को पढ़ने और कुछ प्रारंभिक सामग्री को छोड़ने के बाद, यह (2) के साथ है। और ऐसा प्रतीत होता है कि प्रोलॉग की बैकट्रैकिंग हमेशा हास्केल में हैक की जा रही है!

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

आपकी सिफारिशों के लिए सभी का धन्यवाद! यह एक लिस्प (स्कीम, क्लोजर), प्रोलॉग, या कोक या आगाडा जैसे सबूत सहायक की तरह दिखने वाले मुख्य लैंगेज की तरह दिखता है।


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

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

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

* मुझे लगता है कि आप यहां स्थिर टाइपिंग का मतलब रखते हैं, क्योंकि आप प्रकार घोषित करना चाहते हैं। तकनीकी रूप से, पायथन एक दृढ़ता से टाइप की गई भाषा है, क्योंकि आप किसी संख्या के रूप में एक स्ट्रिंग को मनमाने ढंग से व्याख्या नहीं कर सकते हैं। दिलचस्प बात यह है कि पाइथन डेरिवेटिव्स हैं जो स्थिर टाइपिंग की अनुमति देते हैं, जैसे Boo


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

एक इंटरैक्टिव प्रमेय साबित प्रणाली जैसे कि टहल्फ़ या कॉक भी आपकी कल्पना को हड़ताल कर सकती है।


आपके विवरण को देखते हुए, मैं Ocaml या एफ # का सुझाव Ocaml

मजबूत प्रकार प्रणाली के मामले में एमएल परिवार आमतौर पर बहुत अच्छा होता है। पुनरावृत्ति पर जोर, पैटर्न मिलान के साथ मिलकर, भी स्पष्ट है।

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

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


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

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

विशेष रूप से लिस्पस (सीएल जितना अधिक योजना नहीं) और प्रोलॉग (और हास्केल) रिकर्सन को गले लगाते हैं।

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

इसलिए, ऐसा प्रतीत होता है कि मैंने कुछ भाषाओं को आजमाने के लिए आपके पास कोई समय नहीं छोड़ा है, इसलिए मुझे लगता है कि इनमें से किसी के साथ बिताए गए समय बर्बाद नहीं होंगे, और आपको उन सभी को देखना चाहिए।


महान सवाल - मैं हाल ही में हास्केल का आनंद ले रहे कई महीनों खर्च करने के बाद खुद से यह पूछ रहा हूं, हालांकि मेरी पृष्ठभूमि बहुत अलग है (कार्बनिक रसायन शास्त्र)।

आप की तरह, सी और इसके जैसे सवाल सवाल से बाहर हैं।

मैं पाइथन और रूबी के बीच आज दो व्यावहारिक वर्कहर्स स्क्रिप्टिंग भाषाओं के रूप में आगे बढ़ रहा हूं (mules?) कि दोनों को खुश रखने के लिए उनके पास कुछ कार्यात्मक घटक हैं। यहां कोई रूबीस्ट / पाइथोनिस्ट बहस शुरू किए बिना, लेकिन इस सवाल का मेरा व्यक्तिगत व्यावहारिक उत्तर है:

एक (पायथन या रूबी) सीखें जिसे आपको पहले आवेदन करने का बहाना मिलता है।


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

जैसा कि अन्य पोस्टर्स ने सुझाव दिया है, प्रोलॉग और लिस्प / योजना अच्छी है, भले ही दोनों गतिशील रूप से टाइप किए गए हों। उन्हें एक मजबूत सैद्धांतिक "स्वाद" के साथ कई महान किताबें विशेष रूप से योजना के बारे में प्रकाशित की गई हैं। SICP पर एक नज़र SICP , जो कि बहुत सारे सामान्य कंप्यूटर विज्ञान ज्ञान (मेटा-सर्कुलर दुभाषिया और इसी तरह) को भी व्यक्त करता है।


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


मैं थोड़ा देर हो चुकी हूं लेकिन मुझे लगता है कि किसी ने भी कुछ प्रतिमानों और संबंधित भाषाओं का उल्लेख नहीं किया है जो आपके उच्च स्तर के अमूर्तता और सामान्यता के लिए रूचि रख सकते हैं:


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

हास्केल की तुलना में अधिक शक्ति प्रदान करने वाली एक और लोकप्रिय भाषा Agda - मुझे पता नहीं है कि एग्डा को यह जानकर पता नहीं है कि यह हैकेज पर निर्भर है, और जिन लोगों का मैं सम्मान करता हूं उनका सम्मान करता हूं, लेकिन वे मेरे लिए पर्याप्त कारण हैं।

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


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

सच है, यह आपकी पूर्वकल्पनाओं को फिट नहीं करता है कि आप क्या चाहते हैं, लेकिन इसे एक नज़र डालें। बस यह जानकर कि यह पता लगाने योग्य है। पूर्ण कार्यान्वयन का एकमात्र स्रोत जे सॉफ्टवेयर, jsoftware.com है।






programming-languages