क्या आम समस्याओं के लिए कार्यात्मक प्रोग्रामिंग एक अच्छा फिट नहीं है? [बन्द है]


22

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

क्या आम समस्याओं के लिए कार्यात्मक प्रोग्रामिंग एक अच्छा फिट नहीं है?


वाह! एक पल के लिए मुझे लगा कि आपने कहा "एक दोषपूर्ण प्रतिमान है"। फिर मैं वापस आया और जाँच की।
मार्क C

1
मुझे लगता है कि यह कहना अधिक सटीक है कि साइड-इफेक्ट्स को अलग रखा गया है (वैसे भी हास्केल में) परहेज से। मोनाड राज्य परिवर्तन के लिए अनुमति देते हैं, और एक को "राज्य" भी कहा जाता है।
लैरी कोलमैन

जैसा कि लैरी कोलमैन ने समझाया, यह सच नहीं है कि कार्यात्मक प्रोग्रामिंग साइड इफेक्ट्स से बचा जाता है, लेकिन यह कि यह उनके उपयोग को हतोत्साहित करता है और कुछ भाषाओं में, यह स्पष्ट रूप से उन्हें अलग करता है। उदाहरण के लिए पढ़ें research.microsoft.com/en-us/um/people/simonpj/papers/…
जियोर्जियो

जवाबों:


17

अनुप्रयोग जो प्रकृति में बहुत ही स्टेटफुल हैं। वीडियो गेम एक अच्छा उदाहरण है क्योंकि वे वास्तविक दुनिया का मॉडल बनाते हैं। पिछली बार की स्थिति से हर बार कुछ परिवर्तन होने के बजाय, दुनिया की स्थिति को संशोधित करने के बारे में सोचने के लिए यह बहुत अधिक समझ में आता है।

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

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


9
यह लेख द नेक्स्ट मेनस्ट्रीम प्रोग्रामिंग लैंग्वेज: ए गेम डेवलपर के पर्सपेक्टिव का तर्क है कि विशेष रूप से गेम डेवलपमेंट के लिए, जहां विशुद्ध रूप से कार्यात्मक व्यवहार डिफ़ॉल्ट है, और बग्स से बचने के लिए राज्य परिवर्तन को प्रकारों के माध्यम से ट्रैक किया जाता है। तो हर कोई नहीं मानता है कि कार्यात्मक प्रतिमान स्वाभाविक रूप से गेम प्रोग्रामिंग के लिए बीमार है।
sepp2k

1
@ sepp2k, लिंक के लिए धन्यवाद। मुझे यह देखकर खुशी हुई कि किसी ने असली गेम बनाया है।
मैट ओलेनिक

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

@ मैट: नहीं, आप सही कह रहे हैं, उनका कहना है कि गेम लॉजिक पार्ट में म्यूट स्टेट होगा। हालांकि, यह भाषा को प्रकारों के माध्यम से ट्रैकिंग उत्परिवर्तन से नहीं रोकता है (जो वह "पेशी" अनुभाग में प्रस्तावित करता है)। बेशक "प्रकार के माध्यम से ट्रैकिंग राज्य" "कार्यात्मक" के बराबर नहीं है, इसलिए मैंने अपनी पिछली टिप्पणी को कुछ हद तक आशावादी रूप से अभिव्यक्त किया होगा।
sepp2k

@ sepp2k सही है, मैं देख रहा हूं कि आपका क्या मतलब है।
मैट ओलेनिक

17

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


3
ठीक है, अगर आप सिर्फ हार्डवेयर इंटरफ़ेस का मतलब है कि मुझे संदेह है कि C / C ++ के अलावा कुछ भी अच्छा विकल्प है। हालाँकि उस परत के ऊपर एर्लांग जैसी भाषाओं का उपयोग कभी-कभी किया जाता है, विशेष रूप से दूरसंचार प्रणालियों में। एरलंग एक कार्यात्मक भाषा है जिसे महत्वपूर्ण और दोष-सहिष्णु एम्बेडेड वास्तविक समय प्रणालियों के लिए डिज़ाइन किया गया है।
जोनास

@ जोनास: एरलैंग म्यूटेशन को कम कर सकता है, लेकिन यह आईओ पर निर्भर करता है कि वे उन संदेशों को पास करें जो निश्चित रूप से एक साइड इफेक्ट है।
जॉन हैरोप

11

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

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


-1: आप शुद्धता के बारे में बात कर रहे हैं और प्रथम श्रेणी के कार्यों के उपयोग को अनदेखा कर रहे हैं, जैसे कि GUI कोड में कॉलबैक OOP भाषाओं की तुलना में अशुद्ध FP भाषाओं के साथ बहुत आसान है।
जॉन हैरोप

4
@Jon Harrop: प्रथम श्रेणी के कार्य कार्यात्मक प्रोग्रामिंग भाषाओं के लिए अद्वितीय नहीं हैं। मैं अभी भी तर्क देता हूं कि एफपी शैली जीयूआई के लिए एक अच्छी फिट नहीं है।
मियादी

1
निर्भर करता है कि आप किससे पूछते हैं। अधिकांश कार्यात्मक प्रोग्रामर के लिए, प्रथम श्रेणी के कार्य कार्यात्मक प्रोग्रामिंग की बहुत परिभाषा हैं।
जॉन हैरोप

@Jon Harrop: अधिकांश कार्यात्मक प्रोग्रामर कहेंगे कि कार्यात्मक प्रोग्रामिंग, गणितीय कार्यों की संरचना और मूल्यांकन के रूप में कार्यक्रमों का वर्णन करने की एक विधि है। प्रथम श्रेणी के फ़ंक्शंस इस प्रतिमान का एक महत्वपूर्ण हिस्सा हैं, लेकिन फ़र्स्ट-क्लास फ़ंक्शंस केवल एक कार्यात्मक प्रोग्रामिंग भाषा (या कार्यात्मक प्रोग्राम) नहीं बनाते हैं। कार्यात्मक प्रोग्रामिंग प्रतिमान राज्य और उत्परिवर्तनीय डेटा संरचनाओं के उपयोग को कम करने का प्रयास करता है, और यहां तक ​​कि एफपी भाषाएँ भी इस शैली को प्रोत्साहित करती हैं। एफपी प्रोग्रामिंग की एक शैली के बारे में उतना ही है जितना कि यह प्रथम श्रेणी के कार्यों की तरह अलग-अलग विशेषताएं हैं, और ...
मिपाडी

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

5

डेटा-संचालित व्यावसायिक अनुप्रयोग। उपयोगकर्ता इंटरफ़ेस और सरल डेटा संचालन को FP की आवश्यकता नहीं है।


2
और किसी भी अन्य डेटा / दृश्य अनुप्रयोग, वास्तव में। अधिकांश खेल राज्य के बारे में हैं और इसे बदल रहे हैं, और इसलिए यह एक कार्यात्मक शैली में अच्छी तरह से अनुवाद नहीं करता है।
जॉन पुरडी

18
वास्तव में? मैंने हमेशा सोचा था कि एफपी इसके लिए विशेष रूप से अच्छा होगा। क्या उन ऐप्स का 99% हिस्सा पसंद नहीं है, जो डेटा का चयन, एकत्रीकरण और प्रोजेक्टिंग करते हैं? वह मूल रूप से है filter, reduceऔर map। कुछ में फेंक sort, partition, groupBy। सब के बाद, ऐसे आवेदनों लिखने के लिए सबसे व्यापक रूप से इस्तेमाल किया प्रोग्रामिंग भाषा एक्सेल, जो है एक कार्यात्मक भाषा।
जोर्ग डब्ल्यू मित्तग

3
डेटा-संचालित व्यवसाय एप्लिकेशन और सरल डेटा संचालन वाले एप्लिकेशन एफपी के लिए बहुत अच्छे लगते हैं और मैंने सुना है कि एफपी ऐसी चीजों के लिए लोकप्रिय है। उदाहरण के लिए वॉल स्ट्रीट पर एडवेंचर्स पिता कार्यात्मक प्रोग्रामर
जोनास

1
-1: आपने कुछ एप्लिकेशन को सूचीबद्ध किया है, जो FP पर एक्सेल है।
जॉन हैरोप

2

आप प्रति प्रोग्राम कार्यात्मक प्रोग्रामिंग के लिए अनुकूल नहीं होने के लिए किसी भी समस्या को आसानी से खारिज नहीं कर सकते।

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

एक उदाहरण रियलटाइम एम्बेडेड सिस्टम के लिए पहले से ही उल्लिखित एर्लैंग है।

राज्य-परिपूर्णता भी कार्यात्मक प्रोग्रामिंग के खिलाफ एक अच्छा मानदंड नहीं है, इससे निपटने के लिए कार्यात्मक प्रोग्रामिंग भाषाओं में कई सफल तरीके लागू किए गए हैं।

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

वैश्विक चर की तरह मनमाने दुष्प्रभाव की कोई आवश्यकता नहीं है।

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

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


जीयूआई अनुप्रयोगों जैसे राज्य-पूर्ण अनुप्रयोग वास्तव में कार्यात्मक तरीके से करना मुश्किल है, या क्या आपके पास कोई सिफारिशें हैं?
जोनास

यदि आपके पास किसी प्रकार की प्रक्रिया / थ्रेड एब्स्ट्रैक्शन (जैसे एर्लांग में) है तो आप एक प्रक्रिया में अपने राज्य को पास कर सकते हैं।
बजे पीयर स्ट्रिट्ज़िंगर

3
GUI एप्लिकेशन आमतौर पर एक इवेंट लूप के आसपास बनाए जाते हैं। आप एक कार्यात्मक भाषा में एक अच्छी तरह से एक घटना लूप लिख सकते हैं। यदि इसकी अधिक जटिल है तो आप संभवतः पृष्ठभूमि प्रसंस्करण के लिए कुछ सूत्र / प्रक्रियाएँ जोड़ेंगे। लेकिन अगर आपके पास किसी प्रकार की प्रक्रिया / थ्रेड एब्स्ट्रैक्शन (जैसे एर्लांग में) है, तो आप अपने राज्य को एक प्रक्रिया में आसानी से पास कर सकते हैं। निरंतरता भी आ सकती है। मुझे लगता है कि इसका सिर्फ एक कार्यात्मक तरीके से सामान करने की आदत है, यहां तक ​​कि GUI पर एक हैंडल पाने के लिए भी। आज GUI प्रोग्रामिंग को कठिन माना जाता है क्योंकि अधिकांश टूलकिट कार्यात्मक उपयोग के लिए अभिप्रेत नहीं हैं।
पीयर स्ट्रिट्जिंगर

1
@ जोनास: हास्केल में, आप या तो आईओ मोनड, स्टेट मोनड, या एक संयोजन का उपयोग करेंगे।
लैरी कोलमैन

1
@ जोनास: यह आपकी उपयोगी की परिभाषा पर निर्भर करता है। Wikibook उदाहरण wxHaskell का उपयोग करता है, जबकि रियल वर्ल्ड Haskell gtk2hs का उपयोग करता है। मैंने या तो कोशिश नहीं की है क्योंकि मेरा हास्केल ऐप कमांड लाइन-आधारित है।
लैरी कोलमैन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.