कार्यात्मक प्रोग्रामिंग के लाभ क्या हैं? [बन्द है]


95

आपको क्या लगता है कि कार्यात्मक प्रोग्रामिंग के लाभ क्या हैं? और वे आज प्रोग्रामर पर कैसे लागू होते हैं?

कार्यात्मक प्रोग्रामिंग और OOP के बीच सबसे बड़ा अंतर क्या हैं?


5
द ब्लाब विरोधाभास। paulgraham.com/avg.html
लापताफैक्टर

जवाबों:


75

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

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

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

अन्य प्रमुख लाभ संगामिति है, जो कार्यात्मक प्रोग्रामिंग के साथ करना आसान है क्योंकि संकलक उन अधिकांश कार्यों का ध्यान रख रहा है, जिन्हें मैन्युअल रूप से राज्य चर स्थापित करने की आवश्यकता होती थी (जैसे लूप में पुनरावृत्ति)।

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


12
मुझे लगता है कि आपका पहला पैराग्राफ कार्यात्मक प्रोग्रामिंग की तुलना में प्रोलॉग जैसी घोषणात्मक संबंधपरक प्रोग्रामिंग का वर्णन करने के करीब है।
मैकफरीनम

6
@McPherrinM: अनिवार्य के बजाय कार्यात्मक भाषाएं घोषणात्मक हैं।
रयान

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

2
@ लाइरेन गलत। कृपया मेरी पूर्व टिप्पणी में लिंक देखें
शेल्बी मूर III

कॉनक्युलर के कई सूत्र हैं, जो एक-दूसरे के साथ बातचीत कर सकते हैं, जो कि जरूरी है। एक ही समय में कई स्वतंत्र संगणना करना समानता कहलाता हैEn.wikipedia.org/wiki/Concurrency_(computer_science)
लैम्ब्डा फेयरी

29

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


28
यह सीखने का एक लाभ है, स्वयं प्रतिमान का लाभ नहीं
Moe

2
लेकिन क्या वे वास्तव में अलग हैं? मूल प्रश्नकर्ता के दृष्टिकोण से, मैं यह नहीं कहूंगा कि - वे एक कार्यात्मक भाषा सीखने के प्रयास को पूरा करने में कुल लाभ की तलाश कर रहे हैं।
केंडल हेल्मसटेटर गेलनर

3
"यह सीखने का एक लाभ है, प्रतिमान का लाभ नहीं"। प्रतिमान आपके अन्य OOP काम में लीक हो जाएगा और वहां आपके विकास को सरल बनाने में मदद कर सकता है। आप "इस इनपुट से इस आउटपुट की गणना करें" और "प्रतीक्षा करें --- के बजाय नए डेटा की गणना करने वाले" इन दो कार्यों की रचना "वहाँ पर कुछ साझा चर की स्थिति क्या थी?" और "क्या मुझे सही क्रम में निष्पादित करने के लिए ये प्रक्रियाएं मिलीं?"। गंभीरता से, आपको पायथन, सी #, सी ++, जावा में ये लाभ (एफपी प्रतिमान समझने से) मिलते हैं, आप इसे नाम देते हैं।
जारेड अपडेटिके

11

क्यों कार्यात्मक प्रोग्रामिंग मामले
http://www.cs.kent.ac.uk/people/staff/dat/miranda/whyfp90.pdf

सार

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

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


10

इसलिए एक अच्छा प्रारंभिक बिंदु कुछ ऐसी चीजों को समझने की कोशिश करना होगा जो अनिवार्य भाषाओं में संभव नहीं हैं लेकिन कार्यात्मक भाषाओं में संभव हैं।

यदि आप कम्प्यूटेबिलिटी के बारे में बात कर रहे हैं, तो निश्चित रूप से कुछ भी नहीं है जो कार्यात्मक में संभव है, लेकिन अनिवार्य प्रोग्रामिंग (या इसके विपरीत) नहीं है।

विभिन्न प्रोग्रामिंग प्रतिमानों की बात उन चीजों को संभव बनाने के लिए नहीं है जो पहले संभव नहीं थीं, यह उन चीजों को आसान बनाने के लिए हैं जो पहले कठिन थीं।

फ़ंक्शनल प्रोग्रामिंग का लक्ष्य है कि आप अधिक आसानी से संक्षिप्त, बग-मुक्त और समानांतर होने वाले प्रोग्राम लिख सकें।


5

इसमें एक या दूसरे का होना आवश्यक नहीं है: C # 3.0 जैसी भाषा का उपयोग करना आपको प्रत्येक के सर्वोत्तम तत्वों को मिलाने की अनुमति देता है। OO का उपयोग कक्षा स्तर पर बड़े पैमाने पर संरचना के लिए किया जा सकता है और विधि स्तर पर छोटे पैमाने की संरचना के लिए कार्यात्मक शैली।

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


5

मुझे लगता है कि कार्यात्मक प्रोग्रामिंग की आवश्यकता का सबसे व्यावहारिक उदाहरण संगामिति है - कार्यात्मक कार्यक्रम स्वाभाविक रूप से थ्रेड सुरक्षित हैं और मल्टी कोर हार्डवेयर के उदय को देखते हुए यह अत्यंत महत्वपूर्ण है।

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


3

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

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


1

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


0

यदि आप पहले से ही कार्यात्मक प्रोग्रामिंग नहीं जानते हैं, तो इसे सीखने से आपको समस्याओं को हल करने के अधिक तरीके मिलते हैं।

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

कई भाषाएँ FP और OOP दोनों प्रदान करती हैं, जिनमें OCaml, C # 3.0 और F # शामिल हैं।

चीयर्स, जॉन हैरोप।

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