यह ठीक से परिभाषित करना मुश्किल है कि "कार्यात्मक भाषा" क्या है - आपके द्वारा सूचीबद्ध भाषाओं में से, केवल हास्केल विशुद्ध रूप से कार्यात्मक है (सभी अन्य किसी प्रकार के संकर दृष्टिकोण को अपनाते हैं)। कुछ भाषा सुविधाएँ हैं जो कार्यात्मक प्रोग्रामिंग के लिए बहुत सहायक हैं, हालांकि, और रूबी और पायथन के पास उनमें से बहुत से एफपी के लिए बहुत अच्छे वातावरण नहीं हैं। यहाँ मेरी व्यक्तिगत चेकलिस्ट है, महत्व के क्रम में:
- प्रथम श्रेणी के कार्य और क्लोजर (रूबी, पायथन, और आपके द्वारा सूचीबद्ध अन्य सभी)।
- टेल-कॉल ऑप्टिमाइज़ेशन (एर्लैंग, हास्केल, स्काला और स्कीम की गारंटी है , लेकिन यह पायथन, रूबी या क्लोजर (अभी तक) नहीं है)।
- भाषा और मानक पुस्तकालयों में अपरिवर्तनीयता के लिए समर्थन (यह एक बड़ी बात है कि आपके द्वारा सूचीबद्ध सभी "कार्यात्मक भाषाएं" हैं (योजना को छोड़कर) लेकिन रूबी और पायथन नहीं हैं)।
- संदर्भ-रूप से पारदर्शी (या शुद्ध) कार्यों के लिए भाषा-स्तर का समर्थन (जहां तक मुझे पता है, केवल हास्केल के पास वर्तमान में यह है)।
(1) की आवश्यकता स्पष्ट होनी चाहिए - प्रथम श्रेणी के कार्यों के बिना उच्च-क्रम के कार्य अत्यंत कठिन हैं। जब लोग रूबी और पायथन एफपी के लिए अच्छी भाषा होने की बात करते हैं, तो वे आमतौर पर इस बारे में बात कर रहे होते हैं। हालाँकि, यह विशेष सुविधा आवश्यक है, लेकिन एफपी के लिए अच्छी भाषा बनाने के लिए पर्याप्त नहीं है।
(2) एफपी के लिए एक पारंपरिक आवश्यकता है जब से योजना का आविष्कार किया गया था। TCO के बिना, गहरी पुनरावृत्ति के साथ कार्यक्रम करना असंभव है, जो कि एफपी के कोनेस्टोन में से एक है, क्योंकि आपको स्टफ फ्लो मिलता है। एकमात्र "कार्यात्मक" (लोकप्रिय परिभाषा के अनुसार) भाषा जिसमें यह नहीं है वह क्लजुरे (जेवीएम की सीमाओं के कारण) है, लेकिन क्लोजर में टीसीओ को अनुकरण करने के लिए कई प्रकार के हैक हैं। (FYI करें, रूबी TCO कार्यान्वयन-विशिष्ट है , लेकिन पायथन विशेष रूप से इसका समर्थन नहीं करता है ।) TCO को इसकी गारंटी दी जानी चाहिए कि यदि यह कार्यान्वयन-विशिष्ट है, तो कुछ कार्यों के साथ गहन पुनरावर्ती कार्य टूट जाएंगे, इसलिए आप वास्तव में कर सकते हैं उन्हें बिल्कुल इस्तेमाल करें।
(३) एक और बड़ी बात यह है कि आधुनिक कार्यात्मक भाषाओं (विशेषकर हास्केल, एरलैंग, क्लोजर, और स्काला) में है कि रूबी और पायथन नहीं हैं। बहुत अधिक विस्तार में जाने के बिना, गारंटीकृत अपरिवर्तनीयता विशेष रूप से समवर्ती स्थितियों में बग की संपूर्ण कक्षाओं को समाप्त कर देती है, और लगातार डेटा संरचनाओं जैसी स्वच्छ चीजों की अनुमति देती है । भाषा-स्तर के समर्थन के बिना इन लाभों का लाभ उठाना बहुत मुश्किल है।
(४), मेरे लिए, विशुद्ध रूप से कार्यात्मक भाषाओं (हाइब्रिड भाषाओं के विपरीत) के बारे में सबसे दिलचस्प बात है। निम्नलिखित अत्यंत सरल रूबी फ़ंक्शन पर विचार करें:
def add(a, b)
a + b
end
यह एक शुद्ध फ़ंक्शन की तरह दिखता है, लेकिन ऑपरेटर ओवरलोडिंग के कारण, यह या तो पैरामीटर को म्यूट कर सकता है या कंसोल पर मुद्रण जैसे दुष्प्रभावों का कारण बन सकता है। यह संभावना नहीं है कि कोई व्यक्ति +
साइड इफेक्ट के लिए ऑपरेटर को अधिभारित करेगा , लेकिन भाषा कोई गारंटी नहीं देती है। (यही बात पायथन पर भी लागू होती है, हालाँकि शायद इस विशिष्ट उदाहरण के साथ नहीं।)
विशुद्ध रूप से कार्यात्मक भाषा में, दूसरी ओर, भाषा-स्तर की गारंटी होती है जो फ़ंक्शन संदर्भित रूप से पारदर्शी होते हैं। इसके कई फायदे हैं: शुद्ध कार्यों को आसानी से याद किया जा सकता है; किसी भी प्रकार की वैश्विक स्थिति पर भरोसा किए बिना उन्हें आसानी से परखा जा सकता है; और फ़ंक्शन के भीतर मूल्यों का मूल्यांकन संगामिति मुद्दों के बारे में चिंता किए बिना आलसी या समानांतर में मूल्यांकन किया जा सकता है। हास्केल इसका पूरा फायदा उठाता है, लेकिन मैं यह जानने के लिए अन्य कार्यात्मक भाषाओं के बारे में पर्याप्त नहीं जानता कि वे क्या करते हैं।
कहा जा रहा है कि सभी, किसी भी भाषा (यहां तक कि जावा) में एफपी तकनीकों का उपयोग करना संभव है। उदाहरण के लिए, Google का MapReduce कार्यात्मक विचारों से प्रेरित है, लेकिन जहां तक मुझे पता है कि वे अपनी बड़ी परियोजनाओं के लिए किसी भी "कार्यात्मक" भाषा का उपयोग नहीं करते हैं (मुझे लगता है कि वे ज्यादातर सी ++, जावा और पायथन का उपयोग करते हैं)।