विकिपीडिया का कहना है कि रूबी एक कार्यात्मक भाषा है, लेकिन मैं आश्वस्त नहीं हूं। क्यों या क्यों नहीं?
विकिपीडिया का कहना है कि रूबी एक कार्यात्मक भाषा है, लेकिन मैं आश्वस्त नहीं हूं। क्यों या क्यों नहीं?
जवाबों:
मुझे सबसे निश्चित रूप से लगता है कि आप रूबी में कार्यात्मक शैली का उपयोग कर सकते हैं।
कार्यात्मक शैली में कार्यक्रम करने में सक्षम होने के लिए सबसे महत्वपूर्ण पहलुओं में से एक यह है कि क्या भाषा उच्च आदेश कार्यों का समर्थन करती है ... जो रूबी करती है।
उस ने कहा, रूबी में गैर-कार्यात्मक शैली में भी कार्यक्रम करना आसान है। कार्यात्मक शैली का एक अन्य प्रमुख पहलू राज्य नहीं है, और वास्तविक गणितीय कार्य हैं जो हमेशा इनपुट के दिए गए सेट के लिए समान मान लौटाते हैं। यह रूबी में किया जा सकता है, लेकिन इसे भाषा में लागू नहीं किया जाता है, जैसे हास्केल जैसे कुछ और कड़ाई से कार्यात्मक।
तो, हाँ, यह कार्यात्मक शैली का समर्थन करता है, लेकिन यह आपको गैर-कार्यात्मक शैली में भी कार्यक्रम करने देगा।
Is ruby a functional language?
और सीधे उत्तर में कहा कि यह सरल नहीं है। रूबी कुछ कार्यात्मक विशेषताओं के साथ एक ऑब्जेक्ट ओरिएंटेड भाषा है।
एक भाषा है या नहीं एक कार्यात्मक भाषा महत्वहीन है। फंक्शनल प्रोग्रामिंग एक थीसिस है, जिसे फिलिप वाडलर (द एसेन्स ऑफ फंक्शनल प्रोग्रामिंग) और जॉन ह्यूज (क्यों फंक्शनल प्रोग्रामिंग मैटर्स) द्वारा समझाया गया है।
एक सार्थक प्रश्न है, 'कार्यात्मक प्रोग्रामिंग की थीसिस को प्राप्त करने के लिए रूबी कितना उत्तरदायी है?' जवाब 'बहुत खराब' है।
मैंने अभी हाल ही में इस पर बात की। ये हैं स्लाइड्स
रूबी उच्च-स्तरीय फ़ंक्शंस का समर्थन करता है (ऐरे # मैप, इंजेक्शन, और चयन देखें), लेकिन यह अभी भी एक अनिवार्य, ऑब्जेक्ट-ओरिएंटेड भाषा है।
एक कार्यात्मक भाषा की प्रमुख विशेषताओं में से एक यह है कि यह परिवर्तनशील स्थिति से बचा जाता है। कार्यात्मक भाषाओं में एक वैरिएबल की अवधारणा नहीं है जैसा कि आपके पास रूबी, सी, जावा या किसी अन्य अनिवार्य भाषा में होगा।
एक कार्यात्मक भाषा की एक अन्य प्रमुख विशेषता यह है कि यह "कैसे" के बजाय "क्या" के संदर्भ में एक कार्यक्रम को परिभाषित करने पर केंद्रित है। जब एक ओओ भाषा में प्रोग्रामिंग करते हैं, तो हम "क्या" (वर्ग / विधि नाम) से कार्यान्वयन ("कैसे") को छिपाने के लिए कक्षाएं और तरीके लिखते हैं, लेकिन अंत में इन विधियों को अभी भी बयानों के अनुक्रम का उपयोग करके लिखा जाता है। एक कार्यात्मक भाषा में, आप निष्पादन के अनुक्रम को न्यूनतम स्तर पर भी निर्दिष्ट नहीं करते हैं।
मैं उस समर्थन को प्रस्तुत करता हूं, या एक कार्यात्मक शैली में एक भाषा में कार्यक्रम करने की क्षमता होने से एक कार्यात्मक भाषा नहीं बनती है।
मैं एक कार्यात्मक शैली में भी जावा कोड लिख सकता हूं अगर मैं अपने कॉलेजियम को चोट पहुंचाना चाहता हूं, और कुछ महीनों के सप्ताह में खुद को।
एक कार्यात्मक भाषा का होना न केवल आपके बारे में है कि आप क्या कर सकते हैं, जैसे कि उच्च-क्रम के कार्य, प्रथम श्रेणी के कार्य और करी। यह भी है कि आप क्या नहीं कर सकते , जैसे शुद्ध कार्यों में दुष्प्रभाव।
यह महत्वपूर्ण है क्योंकि यह इस कारण का एक बड़ा हिस्सा है कि कार्यात्मक कार्यक्रम क्यों हैं, या जेनरल में कार्यात्मक कोड, इसके बारे में तर्क करना आसान है। और जब कोड के बारे में तर्क करना आसान हो जाता है, तो बग उथले हो जाते हैं और वैचारिक सतह पर तैरने लगते हैं, जहां उन्हें ठीक किया जा सकता है, जो बदले में कम छोटी गाड़ी कोड देता है।
रूबी अपने मूल में ऑब्जेक्ट-ओरिएंटेड है, इसलिए भले ही एक कार्यात्मक शैली के लिए यह काफी अच्छा समर्थन है, यह स्वयं एक कार्यात्मक भाषा नहीं है।
वैसे भी मेरी गैर-वैज्ञानिक राय है।
संपादित करें: रेट्रोस्पेक्ट में और ठीक टिप्पणियों के लिए विचार के साथ मैंने इस उत्तर को दूर किया है, मुझे लगता है कि वस्तु-उन्मुख बनाम कार्यात्मक तुलना सेब और संतरे में से एक है।
असली विभेदक निष्पादन में अव्यवहारिक है, या नहीं। कार्यात्मक भाषाओं में उनके प्राथमिक भाषाई निर्माण के रूप में अभिव्यक्ति होती है और निष्पादन का क्रम अक्सर अपरिभाषित होता है या आलसी होने के रूप में परिभाषित किया जाता है। सख्त निष्पादन संभव है लेकिन केवल तब उपयोग किया जाता है जब जरूरत हो। अभेद्य भाषा में, सख्त निष्पादन डिफ़ॉल्ट है और जबकि आलसी निष्पादन संभव है, यह अक्सर करने के लिए कठिन होता है और कई धार मामलों में अप्रत्याशित परिणाम हो सकते हैं।
अब, यह मेरी गैर-वैज्ञानिक राय है।
रूबी को "TRUELY" कार्यात्मक होने के लिए निम्नलिखित आवश्यकताओं को पूरा करना होगा।
अपरिवर्तनीय मूल्य: "चर" सेट होने के बाद, इसे बदला नहीं जा सकता। रूबी में, इसका मतलब है कि आपको प्रभावी रूप से स्थिरांक जैसे चर का इलाज करना होगा। भाषा में पूरी तरह से समर्थित नहीं है, आपको प्रत्येक चर को मैन्युअल रूप से फ्रीज करना होगा।
कोई साइड-इफेक्ट नहीं: जब किसी दिए गए मान को पारित किया जाता है, तो एक फ़ंक्शन को हमेशा उसी परिणाम को वापस करना चाहिए। यह अपरिवर्तनीय मूल्यों के साथ हाथ में हाथ जाता है; एक फ़ंक्शन कभी भी एक मूल्य नहीं ले सकता है और इसे बदल सकता है, क्योंकि यह एक साइड-इफेक्ट का कारण होगा जो एक परिणाम को वापस करने के लिए स्पर्शरेखा है।
उच्च-क्रम के कार्य: ये ऐसे कार्य हैं जो कार्यों को तर्क के रूप में अनुमति देते हैं, या रिटर्न मान के रूप में कार्यों का उपयोग करते हैं। यह, यकीनन, किसी भी कार्यात्मक भाषा की सबसे महत्वपूर्ण विशेषताओं में से एक है।
करीकरण: उच्च-क्रम के कार्यों द्वारा सक्षम किया गया, करीकरण एक फ़ंक्शन को रूपांतरित कर रहा है जो एक तर्क में कई तर्कों को लेता है जो एक तर्क लेता है। यह आंशिक फ़ंक्शन अनुप्रयोग के साथ हाथ में जाता है, जो एक बहु-तर्क फ़ंक्शन को एक फ़ंक्शन में बदल रहा है जो कम तर्क लेता है फिर मूल रूप से किया।
पुनरावृत्ति: स्वयं के भीतर से एक फ़ंक्शन को कॉल करके लूपिंग। जब आपके पास उत्परिवर्तित डेटा तक पहुँच नहीं होती है, तो पुनरावर्तन का उपयोग डेटा निर्माण और श्रृंखला निर्माण के लिए किया जाता है। ऐसा इसलिए है क्योंकि लूपिंग एक कार्यात्मक अवधारणा नहीं है, क्योंकि इसमें एक निश्चित समय में लूप की स्थिति को संग्रहीत करने के लिए चर को पास करने की आवश्यकता होती है।
आलसी-मूल्यांकन, या विलंबित मूल्यांकन: मूल्यों के प्रसंस्करण में देरी जब तक कि वास्तव में इसकी आवश्यकता न हो। यदि, एक उदाहरण के रूप में, आपके पास कुछ कोड हैं जो आलसी-मूल्यांकन सक्षम के साथ फाइबोनैचि संख्याओं की सूची उत्पन्न करते हैं, तो यह वास्तव में संसाधित नहीं होगा और गणना की जाएगी जब तक कि परिणाम में एक मान किसी अन्य फ़ंक्शन द्वारा आवश्यक न हो, जैसे कि पुट।
प्रस्ताव (सिर्फ एक विचार)
मैं किसी तरह की परिभाषा के लिए बहुत अच्छा होगा mode
, जिसमें कार्यात्मक प्रतिमान के साथ फाइल घोषित करने का निर्देश हो, उदाहरण
मोड 'कार्यात्मक'
रूबी एक बहु-प्रतिमान भाषा है जो प्रोग्रामिंग की एक कार्यात्मक शैली का समर्थन करती है।
रूबी एक वस्तु-उन्मुख भाषा है, जो अन्य प्रतिमानों (कार्यात्मक, आवश्यक, आदि) का समर्थन कर सकती है। हालांकि, चूंकि रूबी में सब कुछ एक वस्तु है, यह मुख्य रूप से एक ओओ भाषा है।
उदाहरण:
"हैलो" .reverse () = "olleh", प्रत्येक स्ट्रिंग एक स्ट्रिंग ऑब्जेक्ट उदाहरण है और इसी तरह आगे और आगे।
यह "कार्यात्मक भाषा" की आपकी परिभाषा पर निर्भर करता है। व्यक्तिगत रूप से, मुझे लगता है कि यह शब्द अपने आप में काफी समस्याग्रस्त है जब एक निरपेक्ष के रूप में उपयोग किया जाता है। केवल भाषा सुविधाओं की तुलना में "कार्यात्मक भाषा" होने के लिए और अधिक पहलू हैं और अधिकांश इस बात पर निर्भर करते हैं कि आप कहाँ से देख रहे हैं। उदाहरण के लिए, इस संबंध में भाषा के आसपास की संस्कृति काफी महत्वपूर्ण है। क्या यह एक कार्यात्मक शैली को प्रोत्साहित करता है? उपलब्ध पुस्तकालयों के बारे में क्या? क्या वे आपको कार्यात्मक तरीके से उपयोग करने के लिए प्रोत्साहित करते हैं?
उदाहरण के लिए, अधिकांश लोग योजना को एक कार्यात्मक भाषा कहेंगे। लेकिन आम लिस्प के बारे में क्या? मल्टीपल / सिंगल-नेमस्पेस इश्यू और गारंटेड टेल-कॉल एलिमिनेशन (जो कुछ सीएल इंप्लीमेंटेशन सपोर्ट के साथ-साथ कंपाइलर सेटिंग्स पर निर्भर करता है) के अलावा, ऐसी बहुत सी स्कीम नहीं है, जो कॉमन की तुलना में फंक्शनल प्रोग्रामिंग के लिए भाषा के रूप में अधिक अनुकूल हो लिस्प, और अभी भी, अधिकांश लिस्पर्स सीएल को एक कार्यात्मक भाषा नहीं कहेंगे। क्यों? क्योंकि इसके आस-पास की संस्कृति सीएल की अनिवार्य विशेषताओं पर निर्भर करती है (जैसे कि एलओपी मैक्रो, उदाहरण के लिए, जो अधिकांश स्कीमर्स शायद पर आधारित होंगे)।
दूसरी ओर, एक सी प्रोग्रामर सीएल को एक कार्यात्मक भाषा मान सकता है। किसी भी लिस्प बोली में लिखे गए अधिकांश कोड निश्चित रूप से आपके सी कोड के सामान्य ब्लॉक की तुलना में शैली में बहुत अधिक कार्यात्मक हैं। इसी तरह, हास्केल की तुलना में स्कीम बहुत ज्यादा जरूरी है। इसलिए, मुझे नहीं लगता कि कभी कोई निश्चित हां / ना में कोई जवाब हो सकता है। किसी भाषा को कार्यशील कहना या न मानना आपके दृष्टिकोण पर बहुत अधिक निर्भर करता है।
रूबी वास्तव में एक बहु-प्रतिमान भाषा का बहुत अधिक नहीं है, मुझे लगता है। बहु-प्रतिमान का उपयोग लोगों द्वारा अपनी पसंदीदा भाषा को कुछ अलग करने के लिए किया जाता है, जो कई अलग-अलग क्षेत्रों में उपयोगी है।
मैं वर्णन करता हूं कि रूबी एक वस्तु-उन्मुख स्क्रिप्टिंग भाषा है। हां, फ़ंक्शंस प्रथम श्रेणी के ऑब्जेक्ट (सॉर्ट) हैं, लेकिन यह वास्तव में इसे एक कार्यात्मक भाषा नहीं बनाता है। IMO, मैं जोड़ सकता हूं।
कार्यात्मक प्रोग्रामिंग में पुनरावृत्ति आम है। लगभग कोई भी भाषा पुनरावर्तन का समर्थन करती है, लेकिन अगर पूंछ कॉल अनुकूलन (TCO) नहीं है तो पुनरावर्ती एल्गोरिदम अक्सर अप्रभावी होते हैं ।
कार्यात्मक प्रोग्रामिंग भाषाएं पूंछ की पुनरावृत्ति को अनुकूलित करने में सक्षम हैं और निरंतर स्थान में इस तरह के कोड को निष्पादित कर सकती हैं। कुछ रूबी कार्यान्वयन पूंछ पुनरावृत्ति का अनुकूलन करते हैं, दूसरे नहीं करते हैं, लेकिन सामान्य रूप से रूबी कार्यान्वयन को TCO करने की आवश्यकता नहीं होती है। देखें क्या रूबी टेल कॉल अनुकूलन प्रदर्शन करते हैं?
इसलिए, यदि आप कुछ रूबी कार्यात्मक शैली लिखते हैं और कुछ विशेष कार्यान्वयन के TCO पर भरोसा करते हैं, तो आपका कोड एक और रूबी दुभाषिया में बहुत अप्रभावी हो सकता है। मुझे लगता है यही कारण है कि रूबी एक कार्यात्मक भाषा नहीं है (न ही पायथन है)।
कड़ाई से बोलते हुए, किसी भाषा को "कार्यात्मक" के रूप में वर्णित करने का कोई मतलब नहीं है; अधिकांश भाषाएँ कार्यात्मक प्रोग्रामिंग में सक्षम हैं। यहां तक कि C ++ है।
कार्यात्मक शैली कम या ज्यादा अनिवार्य भाषा सुविधाओं का एक उपसमुच्चय है, जो सिन्गनेटिक शुगर और कुछ संकलक अनुकूलन जैसे कि अपरिवर्तनीयता और पूंछ-पुनरावृत्ति चपटेपन के साथ समर्थित है,
उत्तरार्द्ध यकीनन एक मामूली कार्यान्वयन-विशिष्ट तकनीकी है और इसका वास्तविक भाषा से कोई लेना-देना नहीं है। X64 C # 4.0 संकलक पूंछ-पुनरावृत्ति अनुकूलन करता है, जबकि x86 कोई भी मूर्खतापूर्ण कारण के लिए नहीं करता है।
सिंथेटिक चीनी को आमतौर पर कुछ हद तक या किसी अन्य के आसपास काम किया जा सकता है, खासकर अगर भाषा में प्रोग्रामेबल प्रीकॉम्पीलर है (यानी सी की #define)।
यह पूछना थोड़ा अधिक सार्थक हो सकता है, "क्या भाषा __ समर्थन अनिवार्य प्रोग्रामिंग का समर्थन करती है?", और जवाब, उदाहरण के लिए, लिस्प के साथ, "नहीं" है।
कृपया, पुस्तक की शुरुआत में एक नज़र डालें: "ए-ग्रेट-रूबी-ई-पुस्तक" । यह आपके द्वारा पूछे जा रहे बहुत विशिष्ट विषय पर चर्चा करता है। आप रूबी में विभिन्न प्रकार की प्रोग्रामिंग कर सकते हैं। यदि आप कार्यात्मक रूप से प्रोग्राम करना चाहते हैं, तो आप कर सकते हैं। यदि आप अनिवार्य रूप से प्रोग्राम करना चाहते हैं, तो आप कर सकते हैं। यह एक परिभाषा सवाल है कि अंत में रूबी कितना कार्यात्मक है। कृपया, उपयोगकर्ता के द्वारा दिए गए जवाब को देखें।