कार्यात्मक प्रोग्रामिंग भाषा का उपयोग कब करें?


90

किन स्थितियों में मुझे C + ++, C # या Java जैसी अधिक वर्बोज़ ऑब्जेक्ट-ओरिएंटेड भाषा पर एक कार्यात्मक प्रोग्रामिंग भाषा का उपयोग करने के लिए चुनना चाहिए?

मैं समझता हूं कि कार्यात्मक प्रोग्रामिंग क्या है, जो मुझे वास्तव में समझ में नहीं आता है वह किस प्रकार की समस्याओं के लिए एक आदर्श समाधान है?


इस सवाल का जवाब यहाँ है stackoverflow.com/questions/381685/…
krosenvold

2
हमेशा। या कम से कम कभी नहीं।
शेल्बी मूर III

1
लैम्ब्डा के साथ, C # बॉर्डरलाइन फंक्शनल है।
जद

जवाबों:


50

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


2
जब मैंने इस तथ्य पर काबू पा लिया कि मेरा मस्तिष्क स्कीमर वर्ग के पहले सप्ताह में विस्फोट करना चाहता था, जिसे मैंने स्कीम में लिया था, तो मुझे यह भी बहुत मजेदार लगा (और मुझे इसमें बहुत अच्छा लगा)
एलेक्स बरानोस्की

1
आपने गणितीय संगणना के लिए किन कार्यात्मक भाषाओं का उपयोग किया है?
जूल्स

8
इसके अलावा, संकलक! मैंने ऐसे लोगों के बारे में सुना है जिन्होंने हास्केल में कंपाइलर लिखा है, वे कहते हैं कि "कंपाइलर भाषा में फिर कभी कंपाइलर नहीं लिखेंगे"।
श्रीवत्सआर

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

95

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

इसलिए जहां समवर्ती प्रसंस्करण में आता है।

डेटा के बीच अन्योन्याश्रयता के कारण दुर्भाग्य से अधिकांश OOP भाषाएँ एक साथ कई प्रोसेसर का लाभ नहीं ले सकती हैं।

शुद्ध कार्यात्मक प्रोग्रामिंग भाषाओं में कंप्यूटर एक साथ दो (या कई और) फ़ंक्शन चला सकता है क्योंकि वे फ़ंक्शन राज्य की जानकारी से बाहर नहीं बदल रहे हैं।

यहाँ कार्यात्मक प्रोग्रामिंग पर एक उत्कृष्ट लेख है जिसका आप आनंद ले सकते हैं।


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

2
उस लेख को लिंक करने के लिए धन्यवाद। यह वास्तव में मेरे लिए चीजों को समझाने में मदद करता है।
गुप्तकाल

13

मेरे एक मित्र ने अपने कॉलेज के प्रोफेसरों में से कुछ को निम्नलिखित के रूप में कहा:

शीर्ष पर डेटा प्रकारों के साथ एक ग्रिड ड्रा करें और उन डेटा प्रकारों पर संचालन बाईं ओर नीचे करें। यदि आप ग्रिड को लंबवत काटते हैं, तो आप OO कर रहे हैं; यदि आप ग्रिड को क्षैतिज रूप से काटते हैं, तो आप FP कर रहे हैं।

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

  1. क्या आपके पास एक नया अंकन और एक नया तरीका सीखने का निवेश करने का समय है?
  2. आप जिन भाषाओं पर विचार कर रहे हैं, उनमें से पर्याप्त समृद्ध पुस्तकालय हैं जिन्हें आप कुछ पहिया को सुदृढ़ करने से नहीं रोकेंगे?

पहले सवाल के रूप में, यदि आप मुख्य रूप से सीखने के मूल्य के लिए ऐसा कर रहे हैं, तो मैं सुझाव दूंगा कि समर्थन सामग्री (किताबें, लेख, सक्रिय समुदाय, आदि) की विस्तृत श्रृंखला के कारण हास्केल को देखा जाए

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


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

9

व्यावहारिक रूप से पीपी में आप जो कुछ भी कर सकते हैं वह एफपी में किया जा सकता है, और यही बात रिवर्स में भी हो सकती है। यह कुछ को कोड करने का एक और तरीका है - समस्या पर एक और परिप्रेक्ष्य और इसे हल करने का एक अलग तरीका।

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

हालांकि, यदि आप वास्तव में एफपी करना चाहते हैं, तो आप इस शैली का उपयोग C ++ और C # में भी कर सकते हैं। यदि आप मानक पुस्तकालय का उपयोग करते हैं, तो निश्चित रूप से यह 100% एफपी नहीं होगा। दुर्भाग्य से, मुझे नहीं लगता कि C # को कार्यात्मक प्रोग्रामिंग के साथ उपयोग करने के लिए अनुकूलित किया गया है और यह संभवतः बहुत सारे प्रदर्शन मुद्दों को बनाएगा।

यह एक व्यक्तिपरक पोस्ट है, जो मैं एफपी के बारे में सोचता हूं। यह एक कठोर घोषणा नहीं है।


8
"व्यावहारिक रूप से पीपी में आप जो कुछ भी कर सकते हैं वह एफपी में किया जा सकता है" - वास्तव में, यह बिल्कुल सब कुछ है।
ब्लूराजा - डैनी पफ्लुगुएफ्ट

2
@BlueRaja - क्या आप ट्यूरिंग कंप्लीटनेस की बात कर रहे हैं? यदि हां, तो आप जो कहते हैं, उसका पालन नहीं करते हैं। उदाहरण के लिए, कॉनवे का गेम ऑफ लाइफ ट्यूरिंग कम्प्लीट है, लेकिन आप इसका उपयोग वीडियो कार्ड ड्राइवर लिखने के लिए नहीं कर सकते हैं जैसा कि आप सी। में कर सकते हैं। इसी तरह मैं हास्केल में लिखे गए किसी भी नवीनतम गेम को नहीं देखता। एफपी में कर सकते हैं! = सैद्धांतिक रूप से एक एफपी में कर सकते हैं।
लुइगी प्लिंज

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

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

1
@PardonMyRhetoric यह भी मुहावरेदार एफपी होना चाहिए। आप जो बेंचमार्क देखते हैं कि हस्केल का प्रदर्शन C के उस दृष्टिकोण को दर्शाता है, जो "निम्न स्तर" की यूनिडायमैटिक शैली में लिखा गया है, जिसे अधिकांश हास्केल प्रोग्रामर नहीं लिख सकते हैं। उदाहरण के लिए, आप बस अपना हास्केल कोड आउटपुट बनाकर और C कोड संकलित करके समान प्रदर्शन प्राप्त कर सकते हैं। हालांकि निरर्थक। एक संबंधित व्यावहारिक मुद्दा यह है कि "आप क्या कर सकते हैं" बनाम क्या "/ किया जा सकता है"। अगर कुछ बहुत मुश्किल है, तो यह वास्तव में बहुत मायने नहीं रखता है अगर यह सिद्धांत में संभव है (और "संभव" किसके लिए?)।
लुइगी प्लिंज

4

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

आप इस सवाल का जवाब कैसे देंगे "किसी वस्तु उन्मुख प्रोग्रामिंग भाषा का उपयोग कब करें?"।


1
"ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग लैंग्वेज का उपयोग कब करें?" जब आप कुछ भी कम्प्यूटेशनल रूप से मॉडल करना चाहते हैं, तो दूसरी तरफ मैं एक समस्या की तलाश कर रहा हूं कि एफपी सहज ज्ञानवर्धक होगा, मैं अभी भी देख रहा हूं, यही है कि मुझे यह पोस्ट कैसा लगा।
jimjim

@ अरजंग मुझे लगता है कि कार्यात्मक प्रोग्रामिंग गणना अनुप्रयोगों में जबरदस्त उपयोग करेगी जो केवल आउटपुट उत्पन्न करने के लिए इनपुट की आवश्यकता होती है। कोई
उत्परिवर्तन

3

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


2
पार्सिंग डीएसएल? मुझे लगा कि लिस्प मैक्रोज़ और जैसे, डीएसएल को मैक्रोज़ के रूप में लागू किया जाता है, लिस्प कार्यक्रमों द्वारा पार्स होने के लिए कुछ नहीं। गैर-लिस्प भाषाओं के साथ YMMV। :-P
क्रिस जेस्टर-यंग

1

मैंने जो देखा है, वह कार्यक्षमता से अधिक स्वाद का मामला है (कोई दंडित इरादा नहीं)। वहाँ वास्तव में भाषा की शैली के बारे में कुछ भी नहीं है जो इसे विशिष्ट कार्यों में स्वाभाविक रूप से बेहतर या बदतर बनाता है।


2
@ जोनरोप - उस पर विस्तार से ध्यान दें? मुझे यह इतना स्पष्ट नहीं लगता है, और यह शर्म की बात होगी यदि आपने इस धारणा को छोड़ दिया कि आप लोगों को मेयर बूस्टरसिस से नीचे वोट दे रहे हैं।
TED

1
भाषाओं के एमएल परिवार को विशेष रूप से परिष्कृत भाषा की विशेषताओं के साथ-साथ पेड़ों से छेड़छाड़ करने के लिए पैटर्न मिलान जैसे कि (जैसे अभिव्यक्ति पेड़) के लिए नस्ल किया गया था। नतीजतन, भाषाओं का यह परिवार स्वाभाविक रूप से उस विशिष्ट कार्य में बहुत बेहतर है।
जद

1
@ जोनरोप - मैं इसे स्वीकार करूंगा। हालाँकि, आप एमएल के बारे में बात कर रहे हैं, सामान्य रूप से कार्यात्मक भाषा नहीं। मैं DSL में एक बड़ा आस्तिक हूँ, इसलिए मैं इसके लिए डिज़ाइन किए गए सटीक कार्य के लिए किसी विशेष भाषा का उपयोग करने के खिलाफ प्रमाणित नहीं होगा।
TED

आज, पैटर्न मिलान OCaml, F #, Scala, Haskell, Clojure और Erangang सहित लगभग सभी कार्यात्मक भाषाओं में पाया जाता है। उदाहरण के लिए, मैंने हाल ही में गणित पर ध्यान देने के साथ क्लाइंट के लिए एक bespoke बिजनेस रूल्स इंजन बनाया है। यह F # की 1,000 लाइनें है और मुख्य रूप से एक दुभाषिया है। पैटर्न मिलान के लिए लेक्सिंग, पार्सिंग, टाइप चेकिंग और इंटरप्रिटिंग इनपुट सभी बहुत आसान हैं।
जेडी

@ जोनरहॉप .. लेकिन सभी नहीं। इसकी कार्यात्मक भाषाओं की एक अंतर्निहित विशेषता नहीं है, यही वह सवाल है जिसके बारे में पूछ रहा था।
TED

1

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

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

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

logger.expects(once()).method("error") .with( and(stringContains(action),stringContains(cause)) );

यह अनिवार्य रूप से एक फ़ंक्शन का निर्माण करता है जो यह निर्धारित करने के लिए मूल्यांकन किया जाता है कि मॉक ऑब्जेक्ट पर कुछ कॉलिंग अनुक्रम सही है या नहीं। (उदाहरण http://www.jmock.org/yoga.html से चुराया गया )

एक और एफपी-जैसे सिंटैक्स अन्यथा ओओ भाषाओं में क्लोजर का उपयोग होता है, जैसे कि रूबी में।


2
"... यह वास्तव में कोई फर्क नहीं पड़ता है कि आप किन समस्याओं को हल कर सकते हैं।" केवल तभी जब आपके पास अपनी समस्या को हल करने के लिए अनंत समय और पैसा हो।
जद
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.