जावास्क्रिप्ट एक कार्यात्मक प्रोग्रामिंग भाषा है?


135

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


12
@ शलशमिस: नहीं! यह केवल इसे एक शुद्ध (ly) कार्यात्मक भाषा होने से रोकता है। ML (कम से कम आधुनिक बोलियाँ) अशुद्ध हैं, भी - लेकिन कोई उन्हें कार्यात्मक नहीं कहने का साहस करेगा;)

4
ऐसी बहुत सी भाषाएँ हैं जिन्हें आमतौर पर कार्यात्मक माना जाता है, लेकिन जो शुद्ध नहीं हैं। मैं यह नहीं देखता कि इसकी आवश्यकता कैसे है। यदि आप उस सख्त होना चाहते हैं, तो ज्यादातर तथाकथित ओओपी भाषाएं भी ओओपी नहीं हैं। आप लगभग 95% सभी भाषाओं में बिना किसी प्रतिमान वाली भाषाओं के साथ समाप्त होते हैं।
जलफ

6
फ़िर भी इससे फ़र्क क्यों पड़ता है? जब मैं C ++ में कोड करता हूं, तो मुझे परवाह नहीं है कि भाषा "OOP" है या नहीं। मुझे लगता है कि इसकी कुछ OOP सुविधाएँ हैं, और इसमें कुछ कार्यात्मक प्रोग्रामिंग सुविधाएँ, और बहुत सारी अनिवार्य प्रोग्रामिंग सुविधाएँ और कई सामान्य प्रोग्रामिंग सुविधाएँ हैं। लेकिन क्या यह "एक" ओओपी भाषा है या एक एफपी भाषा या कुछ और कोई फर्क नहीं पड़ता। इसी तरह जब मैं JS में कोड करता हूं, तो यह कोई फर्क नहीं पड़ता कि यह FP है या नहीं। क्या मायने रखता है कि यह बहुत अच्छी एफपी सुविधाओं का समर्थन करता है। ऐसा लगता है कि यह गलत सवाल है।
jalf

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

3
@ जैलफ, बिल्कुल। इस सवाल की प्रेरणा मुझे यह जानने की थी कि मेरे साथी और मेरे बारे में जो लोग मुझसे ज्यादा समझदार हैं।
hvgotcodes

जवाबों:


180

इसी तरह के प्रश्न का अपना उत्तर दोहराते हुए ,

कार्यात्मक प्रोग्रामिंग भाषा की कोई स्वीकृत परिभाषा नहीं है।

यदि आप कार्यात्मक भाषा को उस भाषा के रूप में परिभाषित करते हैं जो प्रथम श्रेणी के कार्यों और लैम्ब्डा का समर्थन करती है, तो हाँ, जावास्क्रिप्ट * एक कार्यात्मक भाषा है।

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


मैं आपको निम्नलिखित संबंधित ब्लॉग पोस्ट पढ़ने के लिए प्रोत्साहित करूँगा (और उनके नीचे की टिप्पणियाँ भी):


29
+1 यह इंगित करने के लिए कि कोई सार्वभौमिक परिभाषा नहीं है और जेएस के पास आर्कषक कार्यात्मक भाषा सुविधाओं के कुछ उदाहरण नहीं हैं।

1
जावास्क्रिप्ट के मोज़िला के कार्यान्वयन के बाद के संस्करणों (1.7 के साथ) में विनाशकारी असाइनमेंट के रूप में मिलान करने वाला पैटर्न है: developer.mozilla.org/en/New_in_JavaScript_1.7#section_20
jbeardad

जावास्क्रिप्ट में आंशिक रूप से और आंशिक रूप से मापदंडों को लागू करने की धारणा है, इसलिए मुझे आश्चर्य है कि यदि आपका कथन कि यह समर्थन नहीं करता है तो यह गलत है?
जॉन्बेकर्स

2
@OpenLearner, आंशिक अनुप्रयोग वैसे भी हर उस भाषा से समर्थित है जिसके बारे में मैं सोच सकता हूं, यहां तक ​​कि सी। "समर्थन" की एक निश्चित परिभाषा के लिए भी। जेएस के साथ मामला अलग नहीं है। मुद्दा यह है कि क्या आंशिक आवेदन सरल और उस भाषा में प्रथम श्रेणी है। जेएस में, यह नहीं है। यदि आप मेरे बारे में उत्सुक हैं, तो OCaml या Haskell पर एक नज़र डालें।
लापताफोरटोर

जावास्क्रिप्ट अपरिवर्तनीयता का समर्थन करता है।
fka

26

मैं कहूंगा कि यह एक बहु-प्रतिमान भाषा है।

संपादित करें: यह बहु-प्रतिमान है और इसमें कार्यात्मक निर्माण शामिल हैं।


हाँ, मैं मानता हूँ कि यह एक मिश्रण है और कई अलग-अलग चीजें हैं।
एशले ग्रेनन

5
लेकिन यह इस सवाल का जवाब नहीं है कि क्या यह भी कार्यात्मक है। बहु-प्रतिमान होने का अर्थ है कई प्रतिमानों का समर्थन करना। क्या इनमें से एक प्रतिमान कार्यात्मक प्रोग्रामिंग है?
१०:०१

15

यदि आप दार्शनिक चर्चा के बिंदु पर "कार्यात्मक प्रोग्रामिंग" शब्द को खींचते हैं और मोड़ते हैं, तो यह प्रश्न फिर से खुल सकता है। हालाँकि, फिर आप "क्या C ++ वास्तव में एक प्रोग्रामिंग भाषा है" जैसे उपयोगी प्रश्नों के स्तर पर समाप्त होता है?

अधिक दैनिक स्तर पर आपके प्रश्न का उत्तर "नहीं" है

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

जावास्क्रिप्ट को एक नियंत्रण प्रवाह मिला है और इसे अनिवार्य भाषा के रूप में माना जाता है। अपने डिजाइन उद्देश्य से, यह स्पष्ट रूप से एक कार्यात्मक भाषा नहीं है।


1
डिजाइन उद्देश्य? आपका क्या अर्थ है? पिछली बार मैंने जाँच की थी, इसकी प्रेरणा का एक स्रोत योजना थी। मैं कहता हूँ कि यह स्पष्ट है कि इसका एक डिज़ाइन उद्देश्य कार्यात्मक प्रोग्रामिंग के साथ- साथ अन्य प्रतिमानों का एक बकेटफुल समर्थन करना था
jalf

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

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

1
(i) मानक पुस्तकालय मानक का एक हिस्सा है, जैसे कि वाक्य रचना की विशेषताएं हैं, और एक निश्चित मुहावरेदार और वैचारिक शैली पर जोर देती है। जैसे "C ++ के साथ C ++", "C with classes" से बहुत अलग है। इसका प्रभाव पड़ता है। (ii) जावास्क्रिप्ट में ऑब्जेक्ट ओरिएंटेशन, प्रथम श्रेणी के नागरिक कार्य शामिल हैं - विशेषताएं एम्पेटिव / फंक्शनल-डायकोटॉमी के बजाय ऑर्थोगोनल हैं। हालाँकि, न तो यह सीधे तौर पर करीने को लागू करता है, न ही यह शुद्धता प्रदान करता है, और न ही इसके लिए कभी इसका उद्देश्य है। (iii) उस पर मेरे अंतिम शब्द, पोस्ट का पहला पैराग्राफ देखें।
शुहलो

3
जावास्क्रिप्ट और C ++ एक ही कार्यात्मक प्रोग्रामिंग उपयुक्तता प्रदान करते हैं यह कथन निश्चित रूप से गलत है। जावास्क्रिप्ट एक ही चीज़ को प्राप्त करने के लिए C + के माध्यम से जाना चाहिए गन्दा निर्माण के सभी के बिना जावास्क्रिप्ट कार्यात्मक कार्यात्मक काफी सरल और सरल बनाता है। बहुत सारे महान सी ++ कोडर्स हैं जो प्रमुख रूप से कहते हैं कि कार्यात्मक प्रोग्रामिंग को वास्तव में सी ++ में प्रोत्साहित नहीं किया गया है, हालांकि जावास्क्रिप्ट में कार्यात्मक प्रोग्रामिंग करने के लेख प्रचुर मात्रा में हैं
जॉन्बेकर्स

9

शब्द "फंक्शनल प्रोग्रामिंग" इतनी अधिक है कि इन दिनों यह लगभग बेकार है। दो प्रमुख अर्थ हैं:

  1. प्रथम श्रेणी के कार्य हैं
    • जावास्क्रिप्ट यह है!
  2. लैम्ब्डा कैलकुलस में उपयोग किए जाने वाले कार्यों पर आधारित है, लगातार उत्परिवर्तनीय स्थिति से बचने पर जोर देने के साथ (अक्सर इसे कार्य के लिए दिए गए मापदंडों के साथ प्रतिस्थापित किया जाता है)
    • जैसा कि आमतौर पर लिखा गया है, जावास्क्रिप्ट यह दूरस्थ रूप से नहीं है!

अपना अर्थ चुनें और फिर प्रश्न उत्तर देने योग्य है।


क्या ऐसा स्रोत है जो "कार्यात्मक प्रोग्रामिंग" का उपयोग करता है, जो कि पहले-क्रम वाले नागरिकों के कार्यों के साथ भाषाओं को संदर्भित करता है।
शुहलो

@ user411768: दरअसल, एक अन्य उत्तरदाता विकिपीडिया के लेख से जुड़ा है, जो उस परिभाषा का उपयोग करता है। en.wikipedia.org/wiki/Javascript - जोएल स्पोलस्की ने भी अपनी "क्या आपकी प्रोग्रामिंग भाषा ऐसा कर सकती है?" में इस परिभाषा को निहित किया है। "कार्यात्मक प्रोग्रामिंग" के लाभों पर पोस्ट करें
चक

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

@OpenLearner: ठीक है, हाँ, लेकिन वही जावा का सच है और बहुत सी अन्य भाषाएं जो आमतौर पर कड़ाई से अनिवार्य मानी जाती हैं - आप उन्हें एक कार्यात्मक शैली में लिख सकते हैं, लेकिन यह भाषा का सुखद मार्ग नहीं है।
चक

... लेकिन नवीनतम जेएस इसका समर्थन करेंगे।
एरिक रेपेन

3

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


2

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


उस तर्क से, F # को लंबे समय तक कार्यात्मक नहीं कहा जा सकता है।
एरिक मिकेल्सन

1
सही। विकिपीडिया के अनुसार, एफ # वास्तव में क्या मैं सिर्फ जावास्क्रिप्ट कहा जाता है: "एफ # [...] एक बहु प्रतिमान प्रोग्रामिंग भाषा [...] कि कार्यात्मक प्रोग्रामिंग के साथ-साथ जरूरी ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग विषयों शामिल है"
ब्रायन Onn

2

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


0

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

इसलिए, जब मैं नहीं कहूंगा कि यह है, मुझे लगता है कि राय के लिए जगह है। इसमें कार्यात्मक प्रोग्रामिंग की शास्त्रीय विशेषताएं हैं, इसमें अन्य नहीं हैं।


2
जावास्क्रिप्ट ऑब्जेक्ट ओरिएंटेड है। OO को कक्षाओं की आवश्यकता नहीं होती है, लेकिन इसके लिए वस्तुओं की आवश्यकता होती है।
गुप्त

3
जावास्क्रिप्ट ऑब्जेक्ट ओरिएंटेड नहीं है, यह प्रोटोटाइप आधारित है।
क्रिस

1
जावास्क्रिप्ट प्रोग्रामिंग सूप है। इस का एक सा और एक सा।
एंड्रयू एस

0

जावास्क्रिप्ट एक बिंदु पर है। यह वास्तव में इस बात पर निर्भर करता है कि आप इसे कैसे प्रोग्रामिंग करते हैं। अगर मैं OO तरीके से कोड करता हूं, तो क्या यह OO नहीं होगा? इसलिए यदि आप चीजों को 'कार्यात्मक' तरीके से कोड करते हैं तो यह कार्यात्मक होगा। मुझे लगता है कि यह बहु-प्रतिमान भाषा है इसलिए इसे कॉल करने के लिए सिर्फ एक चीज पूरी तरह से सटीक नहीं है।


0

@petraszd मैं ऑपरेटर के लिए "नया" प्राप्त करने के लिए आपके कोड को थोड़ा फिर से लिखता हूं :

   
   function ffor(a, b, f){
     function it(i){
       if(i > b)return
       f(i)
       it(i+1)
     }
     it(a)
   }

   print("----" + new Date()+"----")

   var funcs = []
   ffor(0, 9, function(i){
     funcs.push(function(){return i})
   })

   ffor(0, 9, function(i){
     print(funcs[i]())
   })

लेकिन मुझे पता है कि इस तरह से बड़े छोरों के लिए नुकसान है ...

जेएस में पूंछ पुनरावृत्ति अनुकूलन के बारे में संबंधित प्रश्न

PS यहाँ पोस्ट cuz टिप्पणी के रूप में पोस्ट करते समय कोड स्वरूपण के साथ समस्या है


0

जावास्क्रिप्ट में, आप कुछ ऐसा कर सकते हैं !!

// Data
var fruits = [
    { name: 'apple',  price: 5 }, 
    { name: 'orange', price: 10 }, 
    { name: 'lemon',  price: 15 }
]

// Request Data from magicURL
request('magicURL')
    .then(selectKeyOf('price'))
    .then(priceMethod('sum'))
    .then((result)=>{
        console.log(result) // 30
    })

मैंने इस अवधारणा को प्रदर्शित करने के लिए एक जीथब पृष्ठ बनाया है और आप मेरे कार्यान्वयन को क्लोन / देख सकते हैं


0

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


-2

मैं जावास्क्रिप्ट में वास्तव में क्या नफरत करता हूं (यदि आप इसे एफपी भाषा के रूप में देखने की कोशिश करते हैं) यह है:

function getTenFunctionsBad() {
  var result = [];
  for (var i = 0; i < 10; ++i) {
    result.push(function () {
      return i;
    });
  }
  return result;
}

function getTenFunctions() {
  var result = [];
  for (var i = 0; i < 10; ++i) {
    result.push((function (i) {
      return function () {
        return i;
      }
    })(i));
  }
  return result;
}

var functionsBad = getTenFunctionsBad();
var functions = getTenFunctions()
for (var i = 0; i < 10; ++i) {
  // using rhino print
  print(functionsBad[i]() + ', ' + functions[i]());
}

// Output:
//   10, 0
//   10, 1
//   10, 2
//   10, 3
//   10, 4
//   10, 5
//   10, 6
//   10, 7
//   10, 8
//   10, 9

आपको इस तरह के व्यवहार को समझने के लिए JS स्टैक एनवायरनमेंट (मुझे नहीं लगता कि यह सही टर्म है) को समझने की जरूरत है।

उदाहरण के लिए स्कीम में आप ऐसी चीज़ का उत्पादन नहीं कर सकते हैं (ठीक है, ठीक है - अंतर्निहित भाषाओं के संदर्भों की मदद से आप इसे बना सकते हैं):

(define (make-ten-functions)
  (define (iter i)
    (cond ((> i 9) '())
          (else (cons (lambda () i) (iter (+ i 1))))))
  (iter 0))

(for-each (lambda (f)
            (display (f))
            (newline)) (make-ten-functions))

1
हम्म, मुझे लगता है कि जावास्क्रिप्ट चर का संदर्भ रखता है, लेकिन मूल्य का संदर्भ नहीं रखता है ।
एरैकोड

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