जवाबों:
एक बड़ी समस्या यह है कि यदि आप हास्केल जैसी भाषा से शुरू करते हैं तो बाकी सब कुछ घटिया प्रतीत होगा।
ईमानदारी से मुझे लगता है कि हास्केल या योजना जैसी भाषा के साथ शुरू करना एक महान विचार होगा।
(मैं मानता हूं कि मैं कार्यात्मक भाषा का आदी हूं) EDIT:
ठीक है जो मुझे दोनों भाषाओं में पसंद है:
योजना एक बहुत ही सरल भाषा का निर्माण करती है और इसके विकास के लिए एक शानदार भाषा है। इसके अलावा, SICP उस योजना के बारे में लिखा जाता है जो उसे वहीं सीखने लायक बनाती है। योजना उस सरलतम चीज़ के बारे में है जिसकी आप कल्पना कर सकते हैं कि एक पूर्ण भाषा हो सकती है।
हास्केल मुझ पर वास्तव में क्या बढ़ रहा है, यह टाइप सिस्टम है। अन्य भाषाओं में मुझे दिखाई देने वाले बहुत से कीड़े कहीं न कहीं गलत प्रकार के दिखाई देने के कारण हैं। हास्केल में यह लगभग असंभव है। इसके अलावा एक आलसी भाषा के विचार में कुछ शांत चीजें होती हैं। उदाहरण के लिए आप हास्केल में अनंत डेटा संरचना बना सकते हैं और फिर केवल उस हिस्से को बना सकते हैं जिसकी आपको आवश्यकता है।
ओओपी लैंग सीखने से पहले एक कार्यात्मक भाषा सीखने का सबसे बड़ा प्लस यह है कि आपके प्रोग्रामिंग कौशल पहले विकसित हो जाते हैं और फिर आप आसानी से ओओपी अवधारणाओं को समझ सकते हैं। यदि आप एक ओओपी भाषा के साथ शुरुआत करते हैं, तो आपको दो चीजों को एक साथ सीखना होगा: "कोड के बारे में सोचना" और "ओओडी के बारे में सोचना"। यह विचलित करने वाला हो सकता है। पहले एक कार्यात्मक भाषा के साथ अभ्यास करें और अपने प्रोग्रामिंग कौशल विकसित करें। फिर ओओपी और अन्य प्रतिमान सीखें। चूंकि ओओपी संरचनात्मक प्रोग्रामिंग में कमी के लिए तैयार था, इसलिए यह समझना आसान होगा कि क्यों। यही कारण है कि सीएस पाठ्यक्रम सी से शुरू होते हैं और फिर सी ++ पर चलते हैं।
कार्यात्मक प्रोग्रामिंग के साथ शुरू करके प्रोग्रामिंग कैसे सीखें, इस सवाल पर , दो क्लासिक सिफारिशें:
एबेल्सन और सुस्मान द्वारा कंप्यूटर प्रोग्रामों की पहली, और स्पष्ट एक क्लासिक संरचना और व्याख्या है , जो कि सीएस के लिए सबसे अच्छा परिचय में से एक बनी हुई है, और योजना का उपयोग करके, एक कार्यात्मक दृष्टिकोण से सिखाया जाता है। यह पूर्ण रूप से ऑनलाइन उपलब्ध है । यदि आप यहां से शुरू नहीं करते हैं, तो आपको कुछ बिंदु के रूप में यहां आना चाहिए।
एक और ग्राउंडर गति से एक ही मैदान को कवर करने वाला एक और हालिया पाठ, और सॉफ्टवेयर इंजीनियरिंग पर अधिक ध्यान केंद्रित करने के लिए मैथ्यू फेलेसेन द्वारा डिजाइन प्रोग्राम्स , और रैकेट / पीएलटी टीम से दूसरों का एक समूह है, जो रैकिट बोली का उपयोग करता है योजना। यह ऑनलाइन भी उपलब्ध है , जैसा कि इन-प्रोग्रेस दूसरा संस्करण है । इस पुस्तक का लाभ यह है कि इसे DrRacket प्रोग्रामिंग वातावरण के साथ उपयोग करने के लिए डिज़ाइन किया गया है, जो कोड के साथ प्रयोग करने के लिए शुरुआती और विशेषज्ञ के लिए एक बहुत ही अनुकूल इंटरफ़ेस प्रदान करता है।
के सवाल पर क्यों कार्यात्मक प्रोग्रामिंग के साथ शुरू, मैं कम से बात करने के लिए करना चाहते हैं बॉब हार्पर के ब्लॉग । कार्नेगी मेलन ने हाल ही में कार्यात्मक प्रोग्रामिंग सिखाने के लिए अपने सीएस पाठ्यक्रम को वापस ले लिया है, और हार्पर अपने ब्लॉग पर अपनी प्रगति को झटका दे रहे हैं। मानक एमएल की परिभाषा के पीछे लोगों में से एक के रूप में, यह स्पष्ट है कि वह इस कदम के लिए है, और वह इसके कारणों का तर्क देता है।
अंत में, मैं हास्केल सीखने के खिलाफ पहले चेतावनी देता हूं, हालांकि अन्य असहमत हो सकते हैं। हालांकि एफसी के लिए हास्केल का शुद्ध दृष्टिकोण निश्चित रूप से अच्छी आदतें पैदा करेगा, लेकिन आलसी अभिकलन पर भाषा का ध्यान शुरुआत के लिए एक अच्छा मैच नहीं है; प्रोग्रामर के रूप में करने के लिए आपको सबसे पहले और सबसे महत्वपूर्ण चीजों में से एक को सीखना होगा, वह यह है कि स्रोत को देखकर आपका प्रोग्राम वास्तव में क्या कर रहा है, और एक ही समस्या के विभिन्न दृष्टिकोणों की सापेक्ष लागत के बारे में। मैं अपना अनुभव बताता हूं कि हास्केल का आलस्य इन दोनों गतिविधियों को कुछ हद तक अनुभवी प्रोग्रामर के लिए भी चुनौती बनाता है, हालांकि आपका माइलेज मई वैरी।
एफपी के साथ शुरुआत करने का मुख्य लाभ (या गैर-नुकसान) यह है कि अधिकांश अवधारणाएं अनिवार्य प्रोग्रामिंग पर भी लागू हो सकती हैं। रैकेट के दायरे कार्यात्मक और अनिवार्य दोनों अवधारणाओं को सिखाने के लिए वीडियो गेम एनालॉग्स का उपयोग करते हैं, और समर्पित छात्रों को न केवल एक कार्यात्मक गेम (एनपीआई) के साथ छोड़ दिया जाता है, बल्कि सशर्त, पुनरावृत्ति, लूप, एडीटी और इवेंट-संचालित डिज़ाइन की एक ठोस समझ होती है। ये अवधारणाएं आधुनिक प्रोग्रामिंग में व्यावहारिक रूप से सर्वव्यापी हैं और लगातार उपयोग की जाती हैं।
हालांकि इससे भी अधिक महत्वपूर्ण यह है कि उच्च-क्रम वाले कार्यों और डेटा प्रकारों के उपयोग के साथ, एफ़पी को कैसे एन्कोड किया जाए , जिसमें कुछ एफपी एक्सेल है। इंडक्शन के माध्यम से शिक्षण द्वारा डिजाइन प्रोग्राम कैसे एक अद्वितीय दृष्टिकोण लेता है। उदाहरण के लिए, छात्र यह सीखते हैं कि fold
किसी सूची के योग और उत्पाद दोनों को लेने के लिए कोड को देखकर कैसे काम करता है, जो कि उनके पास सामान्य रूप से मौजूद है, और कार्यान्वयन को स्वयं प्राप्त करते हैं।
उपरोक्त ओओपी समकक्ष में निम्नलिखित में से एक या अधिक शामिल होंगे: इंटरफेस, अमूर्त वर्ग, जेनरिक, फंक्शनलर्स, या (यदि आप इसे गलत कर रहे हैं) एकल। जबकि ये जावा, IMHO में पूरी तरह से स्वीकार्य डिज़ाइन पैटर्न हैं, वे एक परिचयात्मक पाठ्यक्रम में नहीं हैं और केवल अंतर्निहित सिद्धांतों को मानने के लिए कार्य करते हैं। यहां तक कि किसी ऐसे व्यक्ति के रूप में जिसे एफपी भाषाओं में "देर से" पेश किया गया था, मैं कह सकता हूं कि ओओपी के कभी-शिफ्टिंग समुद्र को नेविगेट करना एक मजबूत कार्यात्मक लंगर होने से बहुत आसान बना दिया गया है।
RACKETEERS
:। निश्चित नहीं कि जब यह समाप्त हो जाए, तो क्षमा करें।
फंक्शनल प्रोग्रामिंग चीजों को बहुत आसान बना देती है। ओओपी भाषाओं में, आपको उस राज्य को बर्बाद किए बिना कई थ्रेड्स के प्रबंधन की स्थिति से निपटना होगा। कार्यात्मक भाषाओं में, जब अधिकांश कार्य शुद्ध कार्यों द्वारा किए जा रहे हैं, तो आपको इसके बारे में चिंता करने की आवश्यकता नहीं है।
गति / प्रदर्शन के संदर्भ में, मैं एक वास्तविक प्रदर्शन जॉकी नहीं हूं, लेकिन कार्यात्मक होने का मतलब धीमी गति से होना नहीं है, और कार्यात्मक भाषाओं की संरचना का उनकी गति के साथ बहुत कम संबंध है। कार्यात्मक भाषाओं का वाक्य विन्यास बहुत भिन्न होता है जैसे कि क्लीजुर और हास्केल के बीच अंतर। क्लोजर के रूप में बहुत तेज है, और वास्तव में अनुकूलन के बाद जावा की गति तक पहुंच सकता है (और कभी-कभी अधिक हो सकता है)।
तो यह सब वास्तव में निर्भर करता है कि आप क्या देख रहे हैं
मुझे लगता है कि प्रोग्रामिंग लैंग्वेज सीखने के दौरान लर्निंग मटीरियल, कुछ अच्छे कोड सैंपल और मेंटर्स की उपलब्धता बहुत जरूरी है। आपकी स्थिति के आधार पर, आपके पास एक संरक्षक हो सकता है जो आपको सिखा सकता है, आदि लेकिन मुझे लगता है कि मुख्यधारा की भाषाओं की तुलना में कार्यात्मक भाषा संसाधन बहुत कम हैं। इसका मतलब है कि आप मुख्यधारा की भाषा सीखने की तुलना में धीमी प्रगति करेंगे। लेकिन अगर आप जल्दी में नहीं हैं, तो यह कोई समस्या नहीं है।
शायद कार्यात्मक प्रोग्रामिंग भाषा सीखने पर विचार करने का सबसे महत्वपूर्ण कारण बीजीय डेटा-प्रकारों की समझ है। मानसिक मानचित्रण OO वर्ग संबंधों और यहां तक कि डेटाबेस डिजाइन में मॉडलिंग करने में मदद करेगा।
मल्टी-कोर / मल्टी-प्रोसेसर सिस्टम पर ध्यान समानांतर एल्गोरिदम के उपयोग पर जोर देता है जो एफपी में अधिक स्पष्ट और स्पष्ट रूप से व्यक्त किया जा सकता है। भाषाओं की लैम्ब्डा शाखा में अगले एक से दो दशकों में उपयोग में मजबूत वृद्धि की संभावना है।
लेकिन कुछ सामान्य नुकसान भी हैं। यह मानना है कि एफपी सरल है एक बड़ी गलती है, क्योंकि अंतरिक्ष और समय की जटिलता की गणना करने के साथ-साथ पड़ाव के प्रमाण वितरित करना लैम्ब्डा कैलकुलस में बहुत अधिक चुनौतीपूर्ण हो सकता है, खासकर उन भाषाओं में जो आलसी मूल्यांकन का समर्थन करते हैं।
तो, दोनों जानें! या शायद बेहतर: पहले एक भाषा सीखें जो दोनों को गले लगाती है, जैसे कि स्काला। यदि आप टाई-टी-शर्ट और एक मामूली डच लहजे में बुरा नहीं मानते हैं, तो शायद आपको डॉ। एरिक मीजर द्वारा एफपी व्याख्यान मिलेंगे , जो एमएसडीएन पर उपयोगी हैं।