python - कार्यात्मक प्रोग्रामिंग के लिए पाइथन बहुत अच्छा क्यों नहीं है?




functional-programming (6)

Guido here इस बारे में एक अच्छी व्याख्या here । यहां सबसे प्रासंगिक हिस्सा है:

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

...

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

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

मैं इसमें से दो चीजें खींचता हूं:

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

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


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

वैसे भी यह पता चला है कि map( foo() , x ) * map( foo(), y ) map( foo(), x * y ) के समान है map( foo(), x * y ) । उत्तरार्द्ध मामला वास्तव में पूर्व की तुलना में तेज़ है क्योंकि पूर्व दो प्रतियां करता है जहां उत्तरार्द्ध एक करता है।

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


ऊपर वर्णित एक और कारण यह नहीं है कि कई अंतर्निर्मित कार्य और अंतर्निर्मित प्रकारों के तरीके किसी ऑब्जेक्ट को संशोधित करते हैं लेकिन संशोधित ऑब्जेक्ट को वापस नहीं करते हैं। कार्यात्मक कोड क्लीनर और अधिक संक्षिप्त होगा। उदाहरण के लिए, अगर some_list.append (some_object) ने कुछ_बॉक्स्ट संलग्न के साथ कुछ_सूची लौटा दी है।


एक बात जो इस प्रश्न (और उत्तरों) के लिए वास्तव में महत्वपूर्ण है, निम्नलिखित है: कार्यात्मक प्रोग्रामिंग क्या है, और इसके सबसे महत्वपूर्ण गुण क्या हैं। मैं इसके बारे में अपना विचार देने की कोशिश करूंगा:

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

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

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

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

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


मुझे SO पर एक "कार्यात्मक" पायथन प्रश्न के उत्तर से लिया गया कोड के टुकड़े के साथ प्रदर्शित करने दें

अजगर:

def grandKids(generation, kidsFunc, val):
  layer = [val]
  for i in xrange(generation):
    layer = itertools.chain.from_iterable(itertools.imap(kidsFunc, layer))
  return layer

हास्केल:

grandKids generation kidsFunc val =
  iterate (concatMap kidsFunc) [val] !! generation

यहां मुख्य अंतर यह है कि हास्केल की मानक लाइब्रेरी में कार्यात्मक प्रोग्रामिंग के लिए उपयोगी कार्य हैं: इस मामले में iterate , concat , और (!!)


मैं कभी भी पायथन को "कार्यात्मक" नहीं कहूंगा, लेकिन जब भी मैं पायथन में प्रोग्राम करता हूं तो कोड हमेशा पूरी तरह कार्यात्मक हो जाता है।

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





functional-programming