यदि हम पायथन के साथ कार्यात्मक प्रोग्रामिंग कर सकते हैं, तो क्या हमें एक विशिष्ट कार्यात्मक प्रोग्रामिंग भाषा की आवश्यकता है? [बन्द है]


22

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

तो सवाल यह है: हमें विशिष्ट कार्यात्मक प्रोग्रामिंग भाषाओं की आवश्यकता क्यों है जैसे कि इरलांग, हास्केल और स्कीम? क्या कुछ अलग है जो ये विशिष्ट कार्यात्मक प्रोग्रामिंग भाषाएं प्रदान करती हैं? हम कार्यात्मक प्रोग्रामिंग के लिए सिर्फ पायथन का उपयोग क्यों नहीं कर सकते?


30
अजगर बनने से पहले ही वे सभी आसपास थे
महमूद होसाम

51
एक फोर्ड पिंटो एक कार है। हमें फेरारी जैसी विशिष्ट तेज कारों की आवश्यकता क्यों है?
मार्टिन यॉर्क

11
वर्गों और टेम्पलेट्स का उपयोग करना, हम C ++ में कुछ भी OO कर सकते हैं। जावा और पायथन कभी क्यों बनाए गए थे? वे क्या जोड़ते हैं?
9000

19
सभी प्रोग्रामिंग भाषाएं (कुछ विशुद्ध अकादमिक शोध भाषाएं) ट्यूरिंग समतुल्य हैं, इसलिए आप भाषा ए में जो कर सकते हैं वह किसी अन्य भाषा में कर सकते हैं। तो, सोचा की इस ट्रेन के बाद, हमें केवल एक ट्यूरिंग पूरी भाषा की आवश्यकता है - जैसे Sendmail.cf;) okmij.org/ftp/Computation/#sendmail-Turing
Maglob

17
यदि आप इनमें से किसी भी भाषा को जानते हैं, तो आप यह दावा नहीं करेंगे कि पायथन कार्यात्मक प्रोग्रामिंग अच्छी तरह से करता है। यह नहीं है यह एफपी-ईश चीजों की हिस्सेदारी को शामिल करने के लिए पर्याप्त रूप से अच्छी तरह से करता है, लेकिन बेहतर नहीं है।

जवाबों:


20

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

पवित्रता

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

प्रदर्शन

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

टेल-कॉल ऑप्टिमाइज़ेशन

प्रदर्शन से संबंधित, लेकिन थोड़ा अलग। यहां तक ​​कि अगर आप रनटाइम प्रदर्शन के बारे में बहुत अधिक परवाह नहीं करते हैं, तो टेल-कॉल ऑप्टिमाइज़ेशन (विशेष रूप से टेल-रिकर्सन के लिए) न होना उन तरीकों को सीमित करता है, जिन्हें आप स्टिक लिमिट्स को हिट किए बिना पायथन में एल्गोरिदम को लागू कर सकते हैं।

वाक्य - विन्यास

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

  • लैम्ब्डा कार्यों के लिए सिंटैक्स को क्रियात्मक और सीमित किया जाता है जिसमें वे शामिल हो सकते हैं
  • फंक्शन कंपोजिशन के लिए कोई सिंथैटिक शुगर नहीं f = g . hf = lambda *arg: g(h(*arg))
  • आंशिक आवेदन के लिए कोई वाक्यविन्यास चीनी नहीं f = map g बनामf = functools.partial(map, g)
  • उच्च क्रम के कार्यों में infix ऑपरेटरों का उपयोग करने के लिए कोई वाक्यविन्यास चीनी sum = reduce (+) lstबनाम।sum = reduce(operator.add, lst)
  • फ़ंक्शन तर्कों के लिए कोई पैटर्न मिलान या गार्ड, जो पुनरावृत्ति अंत की स्थिति और कुछ पठनीय वाक्यविन्यास के साथ कुछ सीमा मामलों को व्यक्त करना आसान बनाता है।
  • फ़ंक्शन कॉल के लिए ब्रैकेट कभी भी वैकल्पिक नहीं होते हैं, और नेस्टेड कॉल के लिए कोई वाक्य्यात्मक चीनी नहीं है। मुझे लगता है कि यह स्वाद का मामला है, लेकिन विशेष रूप से कार्यात्मक कोड में, मुझे लगता है कि यह चेन फंक्शन कॉल्स के लिए सामान्य है और मुझे उस नोटेशन से परिचित होने के बाद y = func1 $ func2 $ func3 xपढ़ने में आसानी होती y = func1(func2(func3(x)))है।

28

ये सबसे महत्वपूर्ण अंतर हैं:

हास्केल

  • आलसी मूल्यांकन
  • मशीन कोड के संकलन
  • स्टेटिक टाइपिंग सुनिश्चित करता है कि फ़ंक्शन शुद्ध हैं
  • प्रकार का अनुमान

हास्केल और एर्लैंग

  • पैटर्न मिलान

Erlang

  • कंसीलर का एक्ट्रेस मॉडल, लाइट-वेट प्रोसेस

योजना

  • मैक्रो

सारी भाषाएँ

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

इसके अलावा, आपके पास ML परिवार जैसे SML, Ocaml और F # और Scala की भाषाओं पर एक नज़र होनी चाहिए, जो OO और फ़ंक्शनल प्रोग्रामिंग को नए तरीके से फ़्यूज़ करती है। इन सभी भाषाओं में अद्वितीय रोचक विशेषताएं हैं।


3
+1 अच्छा पोस्ट। आप एस्कैंग पर हास्केल और लाइट-वेट प्रक्रियाओं पर टाइप-इनफेरेंस जोड़ सकते हैं।
जोनास

1
पायथन में नक्शा, फ़िल्टर और फोल्ड (घटाना) होता है। "वास्तविक क्लोजर" के बारे में: यदि आप एक क्लोजर के रूप में एक वास्तविक क्लोजर को परिभाषित करते हैं जिसमें एक एकल अभिव्यक्ति के अलावा कुछ और हो सकता है, तो हास्केल के पास या तो वास्तविक क्लोजर नहीं हैं (लेकिन निश्चित रूप से हास्केल में कुछ चीजें हैं जो अभिव्यक्ति नहीं हैं ...) । हालांकि अपरिवर्तनीय डेटा संरचनाओं के बारे में बात एक अच्छी है, इसलिए उसके लिए +1 है। इसके अलावा: पूंछ पुनरावृत्ति (और आम तौर पर कम महंगी पुनरावृत्ति)।
sepp2k

2
+1 "स्थिर टाइपिंग सुनिश्चित करता है कि फ़ंक्शन शुद्ध हैं"। यह एक प्रकार की प्रणाली के लिए बहुत अच्छा है जो शुद्ध और गैर-शुद्ध कार्यों के बीच भेदभाव करता है। (C ++ की const doe snot count। :)
मैके

1
@btilly: अगर आप इस दायरे में आने वाले किसी चर को असाइन नहीं कर सकते, तो मैं इसे बंद नहीं मानूंगा। अन्यथा हमें यह कहना होगा कि जावा में भी क्लोजर हैं, क्योंकि आप उसी ट्रिक का उपयोग कर सकते हैं।
किम

3
एक क्लोजर में मैं एक वैरिएबल को उसी तरह एक्सेस कर सकता हूं जो मैं सामान्य रूप से कर सकता हूं। यह हास्केल और रूबी के बंद होने के बारे में सच है, लेकिन पायथन या जावा के खराब विकल्पों में से नहीं। हो सकता है कि कोई और हमें इलंग के बारे में बताए, मैं इसे अच्छी तरह से नहीं जानता।
किम

19

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

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

(1) की आवश्यकता स्पष्ट होनी चाहिए - प्रथम श्रेणी के कार्यों के बिना उच्च-क्रम के कार्य अत्यंत कठिन हैं। जब लोग रूबी और पायथन एफपी के लिए अच्छी भाषा होने की बात करते हैं, तो वे आमतौर पर इस बारे में बात कर रहे होते हैं। हालाँकि, यह विशेष सुविधा आवश्यक है, लेकिन एफपी के लिए अच्छी भाषा बनाने के लिए पर्याप्त नहीं है।

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

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

(४), मेरे लिए, विशुद्ध रूप से कार्यात्मक भाषाओं (हाइब्रिड भाषाओं के विपरीत) के बारे में सबसे दिलचस्प बात है। निम्नलिखित अत्यंत सरल रूबी फ़ंक्शन पर विचार करें:

def add(a, b)
  a + b
end

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

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

कहा जा रहा है कि सभी, किसी भी भाषा (यहां तक ​​कि जावा) में एफपी तकनीकों का उपयोग करना संभव है। उदाहरण के लिए, Google का MapReduce कार्यात्मक विचारों से प्रेरित है, लेकिन जहां तक ​​मुझे पता है कि वे अपनी बड़ी परियोजनाओं के लिए किसी भी "कार्यात्मक" भाषा का उपयोग नहीं करते हैं (मुझे लगता है कि वे ज्यादातर सी ++, जावा और पायथन का उपयोग करते हैं)।


2
पूरी तरह से स्पष्टीकरण के लिए +1 - यहां तक ​​कि एक एफपी बाहरी व्यक्ति के रूप में भी मैंने इसे समझा। धन्यवाद! :-)
पेर्ट टॉरक

इस सवाल का अब तक का सबसे मूल्यवान जवाब। तथ्यों और बहुत सारी जानकारियों पर स्थापित। अच्छा काम।
wirrbel

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

@itsbruce यह पोस्ट बहुत पुरानी है, IIRC स्काला के पास यह समय नहीं था (या मेरे पास गलत हो सकता है;)। अपडेट किया गया।
शास्त्री

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

11

आपके द्वारा उल्लिखित भाषाएँ बहुत अलग हैं।

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

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


@ क्रोन: ठीक है, टाइप सिस्टम एक भाषा की एक महत्वपूर्ण संपत्ति है, और उन्होंने पूछा "क्या कुछ अलग है जो इन विशिष्ट प्रोग्रामिंग भाषाओं प्रदान करता है?"। ज़रूर, आप अन्य भाषाओं के साथ अभिनेता मॉडल का उपयोग कर सकते हैं, लेकिन एर्लांग ने इसे भाषा में बनाया है। एरलैंग हल्के प्रक्रियाओं का उपयोग करता है और वितरित प्रोग्रामिंग के लिए अंतर्निहित भाषा निर्माण करता है - एक "समवर्ती" भाषा।
जोनास

8

पार्टी में हमेशा की तरह देर से, लेकिन वैसे भी बातें कहने के लिए।

एक कार्यात्मक प्रोग्रामिंग भाषा एक ऐसी भाषा नहीं है जो कार्यात्मक प्रोग्रामिंग की अनुमति देती है। अगर हम उस परिभाषा से गुजरते हैं, तो कहीं भी कोई भी भाषा एक कार्यात्मक प्रोग्रामिंग भाषा है। (संयोग से OOP पर भी यही बात लागू होती है। आप अपनी पसंद के अनुसार C में OOP शैली में लिख सकते हैं। इस प्रकार, आपके तर्क के अनुसार, C एक OOP भाषा है।)

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

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

तो हमारे पास कार्यात्मक प्रोग्रामिंग भाषाएं क्यों हैं जब पायथन (या रूबी (या अपनी पसंद की भाषा सम्मिलित करें)) "कार्यात्मक प्रोग्रामिंग कर सकते हैं"? क्योंकि पायथन, एट अल उचित कार्यात्मक प्रोग्रामिंग नहीं कर सकता है। इसीलिए।


6

आप जावा में कार्यात्मक प्रोग्रामिंग कर सकते हैं (उदाहरण के लिए देखें http://functionaljava.org/ )। आप C में ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग भी कर सकते हैं । यह मुहावरेदार नहीं है।

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


4

यह सवाल अनंत भाषाओं और प्रतिमानों पर लागू किया जा सकता है।

  • चूंकि हर कोई C ++ का उपयोग करता है, हमें किसी अन्य सामान्य प्रयोजन की भाषाओं की आवश्यकता क्यों है?
  • चूँकि जावा इतनी बड़ी OO भाषा है, अन्य OO भाषाएँ क्यों मौजूद हैं?
  • चूंकि पर्ल एक अद्भुत स्क्रिप्टिंग भाषा है, हमें अजगर की आवश्यकता क्यों है?
  • यत्, यत्, यत्

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

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


2

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

देखिए: कार्यात्मक प्रोग्रामिंग केवल लैम्ब्डा या map, या उच्च-क्रम के कार्यों के बारे में नहीं है। यह डिजाइन के बारे में है । एक "सच" कार्यात्मक प्रोग्रामिंग भाषा में लिखा गया एक कार्यक्रम कार्यों की संरचना के माध्यम से समस्याओं को हल करता है। जबकि रूबी या पायथन में लिखे गए प्रोग्राम एफपी जैसी सुविधाओं का उपयोग कर सकते हैं, वे आम तौर पर रचित कार्यों के एक सेट की तरह नहीं पढ़ते हैं।


0

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


0

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

आप आसानी से पाइथन (रूबी, स्काला) में एक LISP (या अन्य कार्यात्मक भाषा) दुभाषिया लिख ​​सकते हैं (उस राशि का क्या करता है?)। आप शुद्ध रूप से कार्यात्मक का उपयोग करके पायथन के लिए एक दुभाषिया लिख ​​सकते हैं, लेकिन यह बहुत काम करेगा। यहां तक ​​कि "कार्यात्मक" भाषाएं आजकल बहु-प्रतिमान हैं।

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


@Arkaaito लेकिन क्या आप इस बात से सहमत हैं कि पाइबोन में लैम्ब्डा कैलकुलस, LISP और स्कीम में उपलब्ध प्रत्येक अवधारणा उपलब्ध है ?
मार्क सी

क्या आप सुनिश्चित हैं कि पायथन में प्रत्येक लिस्प अवधारणा उपलब्ध है? मैक्रोज़, कोड-इस-डेटा?
तर्क

@ एसके-लॉजिक मैक्रों लैम्ब्डा-कैलकुलस में नहीं हैं, लेकिन हां, वे पायथन में उपलब्ध हैं, हालांकि उस नाम से नहीं। पायथन एक eval()फ़ंक्शन प्रदान करता है, जिसे कोड के लिए आवश्यक डेटा है , लेकिन यह आगे बढ़ता है: यह आपको अधिकांश रनटाइम वातावरण को संशोधित करने देता है, जैसे LISP में।
अपाला

@ अपाला, गतिशील भाषा eval()एक रनटाइम मेटाप्रोग्रामिंग है। कभी-कभी यह उपयोगी है, लेकिन यह बेहद महंगा है। लिस्प मैक्रोज़ अलग-अलग हैं, यह एक संकलित समय रूपक है। यह किसी भी प्रयोग करने योग्य रूप में पायथन में उपलब्ध नहीं है।
तर्क

@ SK- लॉजिक उस तरह के मैक्रोज़ कोड-इस-डेटा आधार को तोड़ते हैं , क्योंकि प्रोग्राम मैक्रोज़ (या यहां तक ​​कि उनके अस्तित्व का भी पता नहीं) बदल सकते हैं। पायथन में, कार्यक्रमों को रनटाइम के दौरान अपने स्वयं के पार्स पेड़ों तक पहुंच प्राप्त होती है, अगर उन्हें उनकी आवश्यकता होती है। मैक्रोज़ (स्थैतिक पूर्व प्रसंस्करण) बिल्कुल भी कार्यात्मक नहीं है।
अपाला

-5

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

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

- जॉन ह्यूजेस, कार्यात्मक प्रोग्रामिंग क्यों मायने रखता है


6
मैं सहमत हूँ। इसके बिना कोई भी भाषा gotoभयानक है।
आनन।

2
@Anon: या अपने बड़े भाई, call-with-current-continuation
क्रिस जस्टर-यंग

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

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

6
@ मेसन व्हीलर: हाइब्रिड भाषाएं पायथन को एक लूओओंग स्ट्रेच से पूर्ववर्ती करती हैं। लिस्प, उदाहरण के लिए, 1959 की तारीखें और, वास्तव में, एक बहु-प्रतिमान भाषा है। यह प्रोग्रामिंग के लिए कार्यात्मक दृष्टिकोण, प्रक्रियात्मक दृष्टिकोण और वस्तु-उन्मुख दृष्टिकोण का पूरी तरह से समर्थन करता है। शीर्ष पर सही मैक्रो पैकेज के साथ आप लॉजिक प्रोग्रामिंग भी आसानी से कर सकते हैं। योजना, भी, पायथन (और इस पेपर) से पहले की है। यह 1975 तक वापस चला जाता है। शायद आपको प्रोग्रामिंग भाषाओं के इस समय पर एक नज़र डालनी चाहिए ।
मेरे सही चुनाव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.