फंक्शनल प्रोग्रामिंग
सबरूटीन-उन्मुख प्रोग्रामिंग के लिए, प्रक्रियात्मक प्रोग्रामिंग देखें।
कंप्यूटर विज्ञान में, कार्यात्मक (फंक्शनल) प्रोग्रामिंग एक प्रोग्रामिंग प्रतिमान है जहां प्रोग्राम का निर्माण फ़ंक्शन एप्लीकेशन शुद्ध फ़ंक्शन कंपोजिशन (रचना) (कंप्यूटर साइंस) फ़ंक्शन (कंप्यूटर विज्ञान) द्वारा किया जाता है। यह एक वर्णनात्मक प्रोग्रामिंग प्रतिमान है जिसमें फ़ंक्शन की परिभाषाएँ अभिव्यक्ति (कंप्यूटर विज्ञान) के ट्री (डेटा संरचना) हैं जो प्रोग्राम के संचालन की स्थिति को अपडेट करने वाले अनिवार्य स्टेटमेंट (वर्णन) के अनुक्रम के अतिरिक्त अन्य मानो के मानो को मैप करते हैं।
कार्यात्मक प्रोग्रामिंग में, फंक्शनों को प्रथम श्रेणी के सदस्य के रूप में माना जाता है, जिसका अर्थ है कि वे नामों (स्थानीय पहचानकर्ता (कंप्यूटर भाषाओं) सहित) के लिए बाध्य हो सकते हैं, पैरामीटर (कंप्यूटर प्रोग्रामिंग) के रूप में पारित हो सकते हैं, और अन्य फंक्शनों से प्रतिकृति मान, किसी अन्य के रूप में डेटा प्रारूप हो सकता हैं। यह प्रोग्राम को घोषणात्मक प्रोग्रामिंग और रचना योग्य शैली में लिखे जाने की स्वीकृति देता है, जहां छोटे फंक्शनों को एक मॉड्यूलर प्रोग्रामिंग तरीके से जोड़ा जाता है।
कार्यात्मक प्रोग्रामिंग को कभी-कभी पूर्ण रूप से कार्यात्मक प्रोग्रामिंग के पर्याय के रूप में माना जाता है, कार्यात्मक प्रोग्रामिंग का एक उपसमूह जो सभी फंक्शनों को नियतात्मक प्रणाली गणितीय फलन (गणित), या शुद्ध फंक्शनों के रूप में मानता है। जब किसी दिए गए तर्कों के साथ एक शुद्ध फ़ंक्शन कहा जाता है, तो यह सदैव एक ही परिणाम देता है, और किसी भी परिवर्तनीय स्थिति (कंप्यूटर विज्ञान) या अन्य दुष्प्रभाव (कंप्यूटर विज्ञान) से प्रभावित नहीं हो सकता है। यह अशुद्ध प्रक्रिया (कंप्यूटर विज्ञान) के विपरीत है, अनिवार्य प्रोग्रामिंग में सामान्य है, जिसके दुष्प्रभाव हो सकते हैं (जैसे प्रोग्राम की स्थिति को संशोधित करना या उपयोगकर्ता से इनपुट लेना)। पूर्ण रूप से कार्यात्मक प्रोग्रामिंग के समर्थकों का दावा है कि दुष्प्रभाव को प्रतिबंधित करके, प्रोग्राम में कम सॉफ्टवेयर बग हो सकते हैं, डिबगिंग और सॉफ़्टवेयर परीक्षण के लिए आसान हो सकते हैं, और औपचारिक सत्यापन के लिए अधिक अनुकूल हो सकते हैं।[1][2]
कार्यात्मक प्रोग्रामिंग का आधार शिक्षा या शोध का क्षेत्र में हैं, जो लैम्ब्डा गणना से विकसित होती है, जो केवल फंक्शनों पर आधारित संगणना की एक औपचारिक प्रणाली है। योजना (प्रोग्रामिंग भाषा) तुलना में कार्यात्मक प्रोग्रामिंग ऐतिहासिक रूप से कम लोकप्रिय रही है, लेकिन आज उद्योग और शिक्षा में कई कार्यात्मक भाषाओं का उपयोग देखा जा रहा है, जिसमें सामान्य सूची प्रसंस्करण (एलआईएसपी), स्कीम (प्रोग्रामिंग भाषा),[3][4][5][6] क्लोजर, वोल्फ्राम भाषा,[7][8] रैकेट (प्रोग्रामिंग भाषा),[9] एरलांग (प्रोग्रामिंग भाषा),[10][11][12] इलिक्सर (प्रोग्रामिंग भाषा),[13] वस्तुनिष्ठ श्रेणीबद्ध अमूर्त मशीन भाषा,[14][15] हास्केल (प्रोग्रामिंग भाषा),[16][17] और F# (प्रोग्रामिंग भाषा) सम्मिलित है।[18][19] कार्यात्मक प्रोग्रामिंग भी कुछ भाषाओं के लिए महत्वपूर्ण है, जिन्हें विशिष्ट डोमेन में सफलता मिली है, जैसे वेब में जावास्क्रिप्ट,[20] डाटा में R (प्रोग्रामिंग भाषा),[21][22] विश्लेषण में J, K और Q, और एक्सएमएल के लिए एक्सक्वेरी/एक्सएसएलटी एसक्यूएल और लेक्स/वाईएसीसी डोमेन-विशिष्ट घोषणात्मक भाषाएँ कार्यात्मक प्रोग्रामिंग के कुछ तत्वों का उपयोग करती हैं, जैसे कि परिवर्तनशील वस्तु की स्वीकृति नहीं देना।[23] इसके अतिरिक्त, कई अन्य प्रोग्रामिंग भाषाएं कार्यात्मक शैली में प्रोग्रामिंग का समर्थन करती हैं जैसे C ++ 11, C# (प्रोग्रामिंग भाषा),[24] कोटलिन (प्रोग्रामिंग भाषा),[25] पर्ल,[26] पीएचपी,[27] पायथन (प्रोग्रामिंग भाषा),[28] जाओ (प्रोग्रामिंग भाषा),[29] जंग (प्रोग्रामिंग भाषा),[30] राकू (प्रोग्रामिंग भाषा),[31] स्काला (प्रोग्रामिंग भाषा),[32]और जावा (प्रोग्रामिंग भाषा)(जावा 8 के बाद से) से कार्यात्मक प्रोग्रामिंग से सुविधाओं को कार्यान्वित करती हैं।[33]
इतिहास
अलोंजो चर्च द्वारा 1930 के दशक में विकसित लैम्ब्डा गणना, कार्यात्मक एप्लीकेशन से निर्मित संगणना की एक औपचारिक प्रणाली है। 1937 में एलन ट्यूरिंग ने प्रमाणित किया कि लैम्ब्डा गणना और ट्यूरिंग मशीनें संगणना के समकक्ष मॉडल हैं,[34] और दर्शाता है कि लैम्ब्डा गणना ट्यूरिंग पूर्ण है। लैम्ब्डा गणना सभी कार्यात्मक प्रोग्रामिंग भाषाओं का आधार बनाता है। 1920 और 1930 के दशक में मूसा शॉनफिंकेल और हास्केल करी द्वारा एक समकक्ष सैद्धांतिक सूत्रीकरण, संयोजन तर्क विकसित किया गया था।[35]
चर्च ने बाद में एक दुर्बल प्रणाली विकसित की, सामान्य रूप से टाइप किया गया लैम्ब्डा गणना, जिसने लैम्ब्डा गणना को सभी पदों के लिए एक प्रारूप (कंप्यूटर विज्ञान) निर्दिष्ट करके बढ़ाया।[36] यह सांख्यिकीय रूप से टाइप किए गए कार्यात्मक प्रोग्रामिंग के लिए आधार बनाता है।
पहली उच्च-स्तरीय कार्यात्मक प्रोग्रामिंग भाषा, एलआईएसपी (प्रोग्रामिंग भाषा), 1950 के दशक के अंत में अंतर्राष्ट्रीय व्यापार मशीन 700/7000 श्रृंखला के वैज्ञानिक कंप्यूटरों के लिए जॉन मैकार्थी द्वारा मैसाचुसेट्स की तकनीकी संस्था (एमआईटी) में विकसित की गई थी।[37] एलआईएसपी फंक्शनों को चर्च के लैम्ब्डा संकेतन का उपयोग करके परिभाषित किया गया था, जिसे रिकर्सन (कंप्यूटर विज्ञान) फलनों की स्वीकृति देने के लिए एक लेबल निर्माण के साथ विस्तारित किया गया था।[38] सूची प्रसंस्करण (एलआईएसपी) ने पहले कार्यात्मक प्रोग्रामिंग की कई प्रतिमानों की प्रारंभ की, हालांकि प्रारम्भिक लिस्प्स प्रोग्रामिंग प्रतिमान भाषाएं थीं, और कई प्रोग्रामिंग शैलियों के लिए नए प्रतिमान विकसित होने के लिए समर्थन सम्मिलित था। बाद की भाषाओ, जैसे कि स्कीम (प्रोग्रामिंग भाषा) और क्लोजर, और डायलन (प्रोग्रामिंग भाषा) और जूलिया (प्रोग्रामिंग भाषा), ने सूची प्रसंस्करण (एलआईएसपी) को एक स्पष्ट कार्यात्मक कोर के आसपास सामान्य और युक्तिसंगत बनाने की मांग की, जबकि सामान्य सूची प्रसंस्करण (एलआईएसपी) को संरक्षित और इसके द्वारा प्रतिस्थापित कई पुरानी भाषाओ की प्रतिमानात्मक विशेषताएं अपडेट करने के लिए डिज़ाइन किया गया था।[39]
सूचना प्रसंस्करण भाषा (आईपीएल), 1956, को कभी-कभी पहली कंप्यूटर-आधारित कार्यात्मक प्रोग्रामिंग भाषा के रूप में उद्धृत किया जाता है।[40] यह एक असेंबली भाषा है प्रतीकों की सूची में कुशलतापूर्वक प्रयोग करने के लिए असेंबली-शैली की भाषा है, इसमें जनरेटर की धारणा है, जो एक फ़ंक्शन के समान है जो फ़ंक्शन को तर्क के रूप में स्वीकार करता है, और चूंकि यह एक असेंबली-स्तरीय भाषा है, कोड डेटा हो सकता है, इसलिए सूचना प्रसंस्करण भाषा को उच्च-क्रम के फंक्शनों के रूप में माना जा सकता है। हालाँकि, यह रूपांतरित सूची संरचना और समान अनिवार्य विशेषताओं पर बहुत अधिक निर्भर करता है।
केनेथ ई इवरसन ने 1960 के दशक की प्रारंभ में एक प्रोग्रामिंग भाषा (प्रोग्रामिंग भाषा) का विकास किया, जिसका वर्णन उनकी 1962 की पुस्तक प्रोग्रामिंग भाषा ( प्रोग्रामिंग भाषा) में किया गया है।अंतर्राष्ट्रीय मानक पुस्तक संख्या 9780471430148) जॉन बैकस की एफपी (प्रोग्रामिंग भाषा) पर एक प्रोग्रामिंग भाषा का प्राथमिक प्रभाव था। 1990 के दशक की प्रारंभ में, आइवरसन और रोजर हुई ने J (प्रोग्रामिंग भाषा) बनाई। 1990 के दशक के मध्य में, आर्थर व्हिटनी (कंप्यूटर वैज्ञानिक), जिन्होंने पहले आइवरसन के साथ काम किया था, ने K (प्रोग्रामिंग भाषा) बनाई, जिसका उपयोग वित्तीय उद्योगों में व्यावसायिक रूप से इसके डिसेंडेंट Q (Kx सिस्टम्स से प्रोग्रामिंग भाषा) के साथ किया जाता है।
1960 के दशक के मध्य में, पीटर लैंडिन ने एसईसीडी मशीन का आविष्कार किया,[41] कार्यात्मक प्रोग्रामिंग भाषा के लिए पहली अमूर्त मशीन,[42] ऐल्गोरिदम भाषा 60 और लैम्ब्डा गणना के बीच एक पत्राचार का वर्णन किया,[43][44] और आईएसडब्ल्यूआईएम (आप समझते हैं कि मेरा क्या तात्पर्य है) प्रोग्रामिंग भाषा प्रस्तावित की।[45]
जॉन बैकस ने अपने 1977 के ट्यूरिंग अवार्ड व्याख्यान में कार्यात्मक प्रोग्रामिंग (प्रोग्रामिंग भाषा) प्रस्तुत किया क्या प्रोग्रामिंग को वॉन न्यूमैन वास्तुकला शैली से मुक्त किया जा सकता है? एक कार्यात्मक शैली और इसके प्रोग्रामो का बीजगणित।[46] वह कार्यात्मक प्रोग्रामो को एक पदानुक्रमित तरीके से उन रूपों के संयोजन के रूप में परिभाषित करता है जो प्रोग्रामो के बीजगणित की स्वीकृति देते हैं; आधुनिक भाषा में, इसका तात्पर्य है कि कार्यात्मक फ़ंक्शन संरचना के सिद्धांत का अनुसरण करते हैं।[citation needed] बैकस के पेपर ने कार्यात्मक प्रोग्रामिंग में अनुसंधान को लोकप्रिय बनाया, हालांकि इसने लैम्ब्डा-गणना शैली के अतिरिक्त फंक्शन-लेवल प्रोग्रामिंग पर जोर दिया, जो अब कार्यात्मक प्रोग्रामिंग से जुड़ा हुआ है।
1973 की भाषा मेटा भाषा (प्रोग्रामिंग भाषा) एडिनबर्ग विश्वविद्यालय में रॉबिन मिलनर द्वारा बनाई गई थी, और डेविड टर्नर (कंप्यूटर वैज्ञानिक) ने सेंट एंड्रयूज विश्वविद्यालय में भाषा साधारण प्रमाणीकरण सुरक्षा स्तर (प्रोग्रामिंग भाषा) विकसित की थी। 1970 के दशक में एडिनबर्ग में भी, बर्स्टॉल और डार्लिंगटन ने कार्यात्मक भाषा नोड प्रोग्रामिंग भाषा (प्रोग्रामिंग भाषा) विकसित की।[47] नोड प्रोग्रामिंग भाषा (एनपीएल) क्लेन के पुनरावर्तन प्रमेय पर आधारित था और पहली बार फ़ंक्शन परिवर्तन पर उनके कार्य में प्रस्तुत किया गया था।[48] बर्स्टल, मैकक्वीन और सन्नेला ने फिर भाषा होप (प्रोग्रामिंग भाषा) का उत्पादन करने के लिए मेटा भाषा से बहुरूपी प्रकार की जाँच को सम्मिलित किया।[49] मेटा भाषा अंततः कई भाषाओ में विकसित हुआ, जिनमें से सबसे सामान्य अब वस्तुनिष्ठ श्रेणीबद्ध अमूर्त मशीन भाषा और मानक मेटा भाषा हैं।
1970 के दशक में,गाइ एल स्टील और गेराल्ड जे सुस्मान ने योजना (प्रोग्रामिंग भाषा) विकसित की, जैसा कि लैम्ब्डा पेपर्स और 1985 की पाठ्यपुस्तक संरचना और कंप्यूटर प्रोग्राम की व्याख्या में वर्णित है। योजना सूची प्रसंस्करण (एलआईएसपी) की पहली उप-भाषा थी जिसमें लेक्सिकल स्कूपिंग का उपयोग किया गया था और टेल-कॉल अनुकूलन की आवश्यकता थी, ऐसी विशेषताएं जो कार्यात्मक प्रोग्रामिंग को प्रोत्साहित करती हैं।
1980 के दशक में, प्रति मार्टिन-लोफ ने अंतर्ज्ञानवादी प्रकार सिद्धांत (जिसे रचनात्मक प्रकार सिद्धांत भी कहा जाता है) विकसित किया, जो आश्रित प्रकार के रूप में व्यक्त रचनात्मक प्रमाणो के साथ कार्यात्मक फ़ंक्शन से जुड़ा था। इसने इंटरैक्टिव प्रमेय प्रमाणित करने के लिए नए दृष्टिकोणों को उत्पन्न किया और बाद की कार्यात्मक प्रोग्रामिंग भाषाओं के विकास को प्रभावित किया।[citation needed]
डेविड टर्नर द्वारा विकसित मंद कार्यात्मक भाषा, मिरांडा (प्रोग्रामिंग भाषा), प्रारंभ में 1985 में दिखाई दी और हास्केल (प्रोग्रामिंग भाषा) पर इसका गहरा प्रभाव था। मिरांडा के अधिकृत के साथ, हास्केल ने कार्यात्मक प्रोग्रामिंग अनुसंधान कार्यान्वयन प्रकाशन के लिए एक खुला मानक बनाने के लिए 1990 से प्रस्तावित सामान्य सहमति के साथ प्रारंभ किया।
हाल ही में इसे कम्प्यूटेशनल ज्यामिति एल्गोरिदम लाइब्रेरी (सीजीएएल) रूपरेखा पर निर्मित ओपनएससीएडी भाषा में पैरामीट्रिक कंप्यूटर एडेड डिजाइन जैसे निचेस में उपयोग किया गया है, हालाँकि मानों को पुन: निर्धारित करने पर प्रतिबंध (सभी मानों को स्थिरांक के रूप में माना जाता है) ने उन उपयोगकर्ताओं के बीच भ्रम उत्पन्न किया है जो एक अवधारणा के रूप में कार्यात्मक प्रोग्रामिंग से अपरिचित हैं।[50]
व्यावसायिक संस्थापन में कार्यात्मक प्रोग्रामिंग का उपयोग जारी है।[51][52][53]
अवधारणाएं
कई अवधारणाएँ[54] और प्रतिमान कार्यात्मक प्रोग्रामिंग के लिए विशिष्ट हैं, और सामान्य रूप से अनिवार्य प्रोग्रामिंग (वस्तु-उन्मुख प्रोग्रामिंग सहित) के लिए भिन्न हैं। हालाँकि, प्रोग्रामिंग भाषाएँ प्रायः कई प्रोग्रामिंग प्रतिमानों को पूरा करती हैं, इसलिए अधिकांश अनिवार्य भाषाओं का उपयोग करने वाले प्रोग्रामर इनमें से कुछ अवधारणाओं का उपयोग कर सकते हैं।[55]
प्रथम श्रेणी और उच्च क्रम के फ़ंक्शन
उच्च-क्रम के फ़ंक्शन (फलन) ऐसे फलन हैं जो या तो अन्य फलनों को तर्क के रूप में ले सकते हैं या उन्हें परिणाम के रूप में वापस कर सकते हैं। कलन में, उच्च-क्रम फलन का एक उदाहरण अवकल संकारक है, जो किसी फलन डेरिवेटिव (अवलकज) देता है।
उच्च-क्रम के फलन उस उच्च-क्रम के फंक्शनों में प्रथम श्रेणी के फलनों से निकटता से संबंधित हैं और प्रथम श्रेणी के फलन दोनों फलनों को अन्य फलनों के तर्कों और परिणामों के रूप में स्वीकृति देते हैं। दोनों के बीच का अंतर सूक्ष्म है: उच्च-क्रम फंक्शनों की एक गणितीय अवधारणा का वर्णन करता है जो अन्य फलनों पर काम करता है, जबकि प्रथम श्रेणी प्रोग्रामिंग भाषा संस्थाओं के लिए एक कंप्यूटर विज्ञान शब्द है जिसके उपयोग पर कोई प्रतिबंध नहीं है (इस प्रकार प्रथम श्रेणी के कार्य कर सकते हैं) फ़ंक्शन में कहीं भी दिखाई दे सकता है कि अन्य प्रथम श्रेणी की संस्थाएँ जैसे संख्याएँ, अन्य फलनों के लिए तर्कों के रूप में और उनके प्रतिवर्ती मान के रूप में सम्मिलित हो सकती हैं)।
उच्च-क्रम अधीन फ़ंक्शन आंशिक एप्लीकेशन या करीइंग को सक्षम करते हैं, एक तकनीक जो एक समय में एक फ़ंक्शन को उसके तर्कों पर प्रयुक्त करती है, जिसमें प्रत्येक एप्लिकेशन एक नया फ़ंक्शन देता है जो अगले तर्क को स्वीकार करता है। यह एक प्रोग्रामर को संक्षेप में अभिव्यक्त करने देता है, उदाहरण के लिए, अधीन फ़ंक्शन अतिरिक्त संक्रिया के रूप में आंशिक रूप से प्राकृतिक संख्या एक पर प्रयुक्त होता है।
शुद्ध फ़ंक्शन
शुद्ध फ़ंक्शन (या भाव) का कोई दुष्प्रभाव नहीं है (कंप्यूटर विज्ञान) (मेमोरी या इनपुट/आउट्पुट)। इसका अर्थ है कि शुद्ध फ़ंक्शन में कई उपयोगी गुण होते हैं, जिनमें से कई का उपयोग कोड को अनुकूलित करने के लिए किया जा सकता है:
- यदि किसी शुद्ध व्यंजक के परिणाम का उपयोग नहीं किया जाता है, तो इसे अन्य व्यंजकों को प्रभावित किए बिना हटाया जा सकता है।
- यदि एक शुद्ध फलन को उन तर्कों के साथ कहा जाता है जो बिना किसी दुष्प्रभाव का कारण बनते हैं, तो परिणाम उस तर्क सूची के संबंध में स्थिर होता है (कभी-कभी संदर्भित पारदर्शिता या निष्क्रियता कहा जाता है), अर्थात, शुद्ध फलन को फिर से उसी तर्क के साथ कॉल वही परिणाम देता है . (यह कैशिंग अनुकूलन जैसे मेमोइज़ेशन को सक्षम कर सकता है।)
- यदि दो शुद्ध व्यंजकों के बीच कोई डेटा निर्भरता नहीं है, तो उनके क्रम को प्रतिकृत किया जा सकता है, या उन्हें समानांतर में किया जा सकता है और वे एक दूसरे के साथ अन्तः क्षेप नहीं कर सकते हैं (दूसरे शब्दों में, किसी भी शुद्ध व्यंजक का मूल्यांकन थ्रेड-सुरक्षित है)।
- यदि संपूर्ण भाषा दुष्प्रभाव की स्वीकृति नहीं देती है, तो किसी भी मूल्यांकन योजना का उपयोग किया जा सकता है; यह संकलक को एक फ़ंक्शन में व्यंजकों के मूल्यांकन को पुनर्व्यवस्थित करने या संयोजित करने की स्वतंत्रता देता है (उदाहरण के लिए, निर्वनीकरण (कंप्यूटर विज्ञान) का उपयोग करके)।
जबकि अनिवार्य प्रोग्रामिंग भाषाओं के लिए अधिकांश कंपाइलर शुद्ध फलनों का पता लगाते हैं और शुद्ध फ़ंक्शन कॉल के लिए सामान्य-सबएक्सप्रेशन उन्मूलन करते हैं, वे सदैव पूर्व-संकलित लाइब्रेरी के लिए ऐसा नहीं कर सकते हैं, जो सामान्य रूप से इस जानकारी को प्रदर्शित नहीं करते हैं, इस प्रकार उन बाहरी फंक्शनों को सम्मिलित करने वाले अनुकूलन को रोकते हैं। कुछ कंपाइलर्स, जैसे जीएनयू संकलक संग्रह, ऐसे अनुकूलन को सक्षम करने के लिए बाहरी फंक्शनों को स्पष्ट रूप से चिह्नित करने के लिए प्रोग्रामर के लिए अतिरिक्त कीवर्ड जोड़ते हैं। फोरट्रान 95 भी फंक्शनों को शुद्ध निर्धारित करने देता है।[56] C ++ 11 समान सिमेन्टिक के साथ constexpr
कीवर्ड जोड़ा गया।
रिकर्सन (पुनरावर्तन)
कार्यात्मक भाषाओं में पुनरावर्तन (लूपिंग) सामान्य रूप से पुनरावर्तन के माध्यम से पूरा किया जाता है। पुनरावर्तन (कंप्यूटर विज्ञान) स्वयं को आमंत्रित करता है, एक संचालन को तब तक पुनरावृत किया जाता है जब तक कि यह पुनरावृत्ति (कंप्यूटर विज्ञान) तक नहीं पहुंच जाता। सामान्य रूप से, प्रत्यावर्तन को कॉल स्टैक बनाए रखने की आवश्यकता होती है, जो रिकर्सन की गहनता तक रैखिक मात्रा में स्थान का उपभोग करता है। यह अनिवार्य लूप के अतिरिक्त पुनरावर्तन को निषेधात्मक रूप से कीमती बना सकता है। हालांकि, पुनरावर्तन के एक विशेष रूप को टेल रिकर्सन के रूप में जाना जाता है जिसे अनिवार्य भाषाओं में पुनरावृत्ति को प्रयुक्त करने के लिए उपयोग किए जाने वाले समान कोड में एक कंपाइलर द्वारा पहचाना और अनुकूलित किया जा सकता है। अन्य दृष्टिकोणों के बीच, संकलन के समय प्रोग्राम को निरंतरता पासिंग शैली में परिवर्तित करके टेल रिकर्सन अनुकूलन को प्रयुक्त किया जा सकता है।
योजना (प्रोग्रामिंग भाषा) भाषा मानक को उपयुक्त टेल रिकर्सन का समर्थन करने के लिए कार्यान्वयन की आवश्यकता होती है, जिसका अर्थ है कि उन्हें सक्रिय टेल कॉल की असीमित संख्या की स्वीकृति देनी चाहिए।[57][58] उपयुक्त टेल रिकर्सन केवल एक अनुकूलन नहीं है; यह एक भाषा सुविधा है जो उपयोगकर्ताओं को आश्वस्त करती है कि वे एक लूप को व्यक्त करने के लिए पुनरावर्तन का उपयोग कर सकते हैं और ऐसा करना स्थान के लिए सुरक्षित होगा।[59] इसके अतिरिक्त, इसके नाम के विपरीत, यह सभी टेल कॉलों के लिए कॉल है, केवल टेल रिकर्सन नहीं। जबकि उपयुक्त टेल रिकर्सन सामान्य रूप से कोड को अनिवार्य लूप में बदलकर प्रयुक्त किया जाता है, कार्यान्वयन इसे अन्य तरीकों से प्रयुक्त कर सकता है। उदाहरण के लिए, चिकन (योजना कार्यान्वयन) अभिप्रायपूर्वक एक स्टैक बनाए रखता है और स्टैक ओवरफ़्लो होने देता है। हालाँकि, जब ऐसा होता है, तो इसका गारवेज संग्रह (कंप्यूटर विज्ञान) स्थान वापस पाने का दावा करेगा,[60] सक्रिय टेल कॉल की असीमित संख्या की स्वीकृति देता है तथापि यह टेल रिकर्सन को लूप में नहीं परिवर्तित होता है।
पुनरावर्तन के सामान्य पैटर्न को उच्च-क्रम के फंक्शनों का उपयोग करके दूर किया जा सकता है, जिसमें कैटामोर्फिज्म और एनामॉर्फिज्म (या फोल्ड और अनफोल्ड) सबसे स्पष्ट उदाहरण हैं। इस तरह की पुनरावर्तन योजनाएँ अनिवार्य भाषाओं में प्रोग्राम लूप्स जैसे अंतर्निहित नियंत्रण संरचनाओं के अनुरूप भूमिका निभाती हैं।
अधिकांश सामान्य उद्देश्य कार्यात्मक प्रोग्रामिंग भाषाएं अप्रतिबंधित पुनरावर्तन की स्वीकृति देती हैं और ट्यूरिंग पूर्ण होती हैं, जो रुकने की समस्या को अनिर्णीत समस्या बना देती है, समतुल्य तर्क की अप्रामाणिकता उत्पन्न कर सकती है, और सामान्य रूप से भाषा के प्रारूप प्रणाली द्वारा व्यक्त तर्क में असंगतता के प्रारंभ की आवश्यकता होती है। कोक जैसी कुछ विशेष उद्देश्य वाली भाषाएँ केवल अच्छी तरह से स्थापित पुनरावर्तन की स्वीकृति देती हैं और दृढ़ता से सामान्यीकरण कर रही हैं (गैर-समाप्ति संगणनाएँ केवल सह-डाटा (कंप्यूटर विज्ञान) नामक मानो की अनंत संचालन के साथ व्यक्त की जा सकती हैं)। परिणामस्वरूप, ये भाषाएँ ट्यूरिंग पूर्ण होने में विफल रहती हैं और उनमें कुछ फंक्शनों को व्यक्त करना असंभव है, लेकिन वे अभी भी अप्रतिबंधित पुनरावर्तन द्वारा प्रस्तुत की गई समस्याओं से बचते हुए दिलचस्प संगणनाओं की एक विस्तृत श्रेणी को व्यक्त कर सकते हैं। कुछ अन्य नियन्त्रण के साथ अच्छी तरह से स्थापित पुनरावर्तन तक सीमित कार्यात्मक प्रोग्रामिंग को पूर्ण कार्यात्मक प्रोग्रामिंग कहा जाता है।[61]
कठिन बनाम गैर-कठिन मूल्यांकन
कार्यात्मक भाषाओं को वर्गीकृत किया जा सकता है कि क्या वे कठिन (उत्सुक) या गैर-कठिन (मंद) मूल्यांकन का उपयोग करते हैं, अवधारणाएं जो दर्शाती हैं कि फलन तर्कों को कैसे संसाधित किया जाता है जब एक पद का मूल्यांकन किया जा रहा है। तकनीकी अंतर असफल या अलग-अलग संगणनाओं वाले पदों के सांकेतिक सिमैन्टिक में है। कठिन मूल्यांकन के अंतर्गत, किसी भी पद का असफल उपपद वाला मूल्यांकन विफल हो जाता है। उदाहरण के लिए, पद :
print length([2+1, 3*2, 1/0, 5-4])
सूची के तीसरे तत्व में शून्य से विभाजन के कारण कठिन मूल्यांकन के अंतर्गत विफल रहता है। मंद मूल्यांकन के अंतर्गत, लम्बाई फलन मान 4 (अर्थात, सूची में वस्तुओं की संख्या) देता है, क्योंकि इसका मूल्यांकन करने से सूची बनाने वाली शर्तों का मूल्यांकन करने का प्रयास नहीं होता है। संक्षेप में, कठिन मूल्यांकन सदैव फ़ंक्शन को प्रयुक्त करने से पहले फ़ंक्शन के तर्कों का पूरी तरह से मूल्यांकन करता है। मंद मूल्यांकन फ़ंक्शन तर्कों का मूल्यांकन नहीं करता है जब तक कि फ़ंक्शन कॉल का मूल्यांकन करने के लिए उनके मानों की आवश्यकता न हो।
कार्यात्मक भाषाओं में मंद मूल्यांकन के लिए सामान्य कार्यान्वयन योजना ग्राफ़ कमी है।[62] मिरांडा (प्रोग्रामिंग भाषा), क्लीन (प्रोग्रामिंग भाषा), और हास्केल (प्रोग्रामिंग भाषा) सहित कई शुद्ध कार्यात्मक भाषाओं में डिफ़ॉल्ट रूप से मंद मूल्यांकन का उपयोग किया जाता है।
ह्यूजेस 1984 डेटा संचार के उत्पादकों और उपभोक्ताओं के स्वतंत्र कार्यान्वयन को आसान बनाकर, चिंताओं को अलग करके प्रोग्राम प्रतिरूपकता में संशोधन के लिए एक तंत्र के रूप में मंद मूल्यांकन के लिए तर्क देता है।[2] लॉन्चबरी 1993 कुछ कठिनाइयों का वर्णन करता है जो मंद मूल्यांकन प्रस्तुत करता है, विशेष रूप से एक फ़ंक्शन की भंडारण आवश्यकताओं का विश्लेषण करने में, और इस तरह के विश्लेषण में सहायता के लिए एक परिचालन सिमैन्टिक का प्रस्ताव करता है।[63] हार्पर 2009 ने उन्हें अलग करने के लिए भाषा के प्रारूप प्रणाली का उपयोग करते हुए एक ही भाषा में कठिन और मंद मूल्यांकन दोनों को सम्मिलित करने का प्रस्ताव दिया है।[64]
प्रारूप प्रणाली
विशेष रूप से 1970 के दशक में हिंडले-मिलनर प्रकार के अनुमान के विकास के बाद से, कार्यात्मक प्रोग्रामिंग भाषाओं में टाइप किए गए लैम्ब्डा गणना का उपयोग करने की प्रवृत्ति रही है, संकलन समय पर सभी अमान्य प्रोग्रामो को अस्वीकार कर दिया और गलत सकारात्मक त्रुटियों को जोखिम में डाल दिया, जो कि सभी मान्य लैम्ब्डा कैलकुलस के विपरीत है, जो सभी मान्य स्वीकार करता है। संकलन समय पर कार्यक्रम और सूची प्रसंस्करण (एलआईएसपी) और इसके रूपों (जैसे योजना) में उपयोग की जाने वाली गलत नकारात्मक त्रुटियों का जोखिम, क्योंकि वे रनटाइम पर सभी अमान्य प्रोग्रामों को अस्वीकार कर देते हैं जब जानकारी वैध प्रोग्रामों को अस्वीकार करने के लिए पर्याप्त होती है। बीजगणितीय डेटाटाइप्स का उपयोग जटिल डेटा संरचनाओं के कुशलतापूर्वक प्रयोग को सुविधाजनक बनाता है; दृढ़ संकलन-समय प्रारूप की जाँच की उपस्थिति परीक्षण-संचालित विकास जैसी अन्य विश्वसनीयता तकनीकों के अभाव में प्रोग्रामों को अधिक विश्वसनीय बनाती है, जबकि टाइप अनुमान प्रोग्रामर को अधिकांश स्थितियों में संकलक को मैन्युअल रूप से प्रारूप घोषित करने की आवश्यकता से मुक्त करता है।
कुछ शोध-उन्मुख कार्यात्मक भाषाएं जैसे कोक, एजीडीए (प्रमेय समर्थक), केयेन (प्रोग्रामिंग भाषा), और एपिग्राम (प्रोग्रामिंग भाषा) अंतर्ज्ञानवादी प्रारूप के सिद्धांत पर आधारित हैं, जो प्रारूपों को शर्तों पर निर्भर करती हैं। ऐसे प्रारूपों को आश्रित प्रारूप कहा जाता है। इस प्रकार की प्रणालियों में निर्णायक प्रकार का अनुमान नहीं होता है और इन्हें समझना और प्रोग्राम करना मुश्किल होता है।[65][66][67][68] लेकिन आश्रित प्रारूप उच्च-क्रम तर्क में एकपक्षीय प्रस्ताव व्यक्त कर सकते हैं। करी-हावर्ड समरूपता के माध्यम से, इन भाषाओं में अच्छी तरह से टाइप किए गए फ़ंक्शन औपचारिक गणित प्रमाण लिखने का एक साधन बन जाते हैं जिससे एक संकलक औपचारिक सत्यापन उत्पन्न कर सकता है। जबकि ये भाषाएँ मुख्य रूप से अकादमिक अनुसंधान (औपचारिक गणित सहित) में रुचि रखती हैं, अभियांत्रिकी में भी इनका उपयोग प्रारंभ हो गया है। कॉम्पर्ट C (प्रोग्रामिंग भाषा) के एक उपसमुच्चय के लिए एक कंपाइलर है जो कोक में लिखा गया है और औपचारिक रूप से सत्यापित है।[69]
सामान्यीकृत बीजगणितीय डेटा प्रारूप (जीएडीटी) कहे जाने वाले आश्रित प्रारूपों का एक सीमित रूप इस तरह से प्रयुक्त किया जा सकता है जो इसकी अधिकांश असुविधाओं से बचते हुए निर्भर रूप से टाइप की गई प्रोग्रामिंग के कुछ लाभ प्रदान करता है।[70] सामान्यीकृत बीजगणितीय डेटा प्रारूप वस्तुनिष्ठ श्रेणीबद्ध अमूर्त मशीन भाषा में ग्लासगो हास्केल कंपाइलर में उपलब्ध हैं[71] और स्काला (प्रोग्रामिंग भाषा) में,[72] और जावा और C# सहित अन्य भाषाओं के अतिरिक्त के रूप में प्रस्तावित किए गए हैं।[73]
संदर्भित पारदर्शिता
कार्यात्मक प्रोग्रामो में असाइनमेंट स्टेटमेंट (नियतन कथन) नहीं होते हैं, अर्थात, एक कार्यात्मक फ़ंक्शन में एक चर (वेरिएबल) का मान परिभाषित होने के बाद कभी परिवर्तित नहीं होता है। यह दुष्प्रभाव की किसी भी संभावना को समाप्त करता है क्योंकि निष्पादन के किसी भी बिंदु पर किसी भी चर को उसके वास्तविक मान से बदला जा सकता है। इसलिए, कार्यात्मक फ़ंक्शन संदर्भित रूप से पारदर्शी हैं।[74]
C (प्रोग्रामिंग भाषा) समनुदेशन स्टेटमेंट पर x = x * 10
विचार करें, यह वेरिएबल x
को निर्दिष्ट किए गए मान को बदल देता है मान लीजिए कि 1
का प्रारंभिक मान x
था, फिर x
चर के निरंतर दो मूल्यांकन क्रमशः 10
और 100
प्राप्त करते हैं। स्पष्ट रूप से x = x * 10
को 10
या 100
के साथ बदलने से प्रोग्राम को एक अलग अर्थ मिलता है, और इसलिए अभिव्यक्ति संदर्भित रूप से पारदर्शी नहीं है। वास्तव में, समनुदेशन स्टेटमेंट कभी भी संदर्भित रूप से पारदर्शी नहीं होते हैं।
अब, अन्य फ़ंक्शन पर विचार करें जैसे int plusone(int x) {return x+1;}
पारदर्शी है, क्योंकि यह इनपुट x को स्पष्ट रूप से परिवर्तित नहीं है और इस प्रकार इइसका कोई दुष्प्रभाव नहीं है। कार्यात्मक कार्यक्रम विशेष रूप से इस प्रकार के फ़ंक्शन का उपयोग करते हैं और इसलिए संदर्भित रूप से पारदर्शी होते हैं।
डेटा संरचना
पूर्ण रूप से कार्यात्मक डेटा संरचनाओं को प्रायः उनके अनिवार्य प्रोग्रामिंग समकक्षों की तुलना में एक अलग तरीके से दर्शाया जाता है।[75] उदाहरण के लिए, निरंतर अभिगम्य और अपडेट समय के साथ सरणी डेटा संरचना सबसे अनिवार्य भाषाओं का एक मूल घटक है, और कई अनिवार्य डेटा-संरचनाएं, जैसे हैश तालिका और बाइनरी स्टैक, सरणियों पर आधारित हैं। सरणियों को मानचित्र (कंप्यूटर विज्ञान) या रैंडम अभिगम्य सूचियों द्वारा प्रतिस्थापित किया जा सकता है, जो पूर्ण रूप से कार्यात्मक कार्यान्वयन को स्वीकार करते हैं, लेकिन लॉगरिदमिक अभिगम्य और अपडेट समय होते हैं। पूर्ण रूप से कार्यात्मक डेटा संरचनाओं में स्थायी डेटा संरचना होती है, जो डेटा संरचना के पिछले संस्करणों को अपरिवर्तित रखने का गुण है। क्लोजर में, निरंतर डेटा संरचनाओं को उनके अनिवार्य समकक्षों के कार्यात्मक विकल्प के रूप में उपयोग किया जाता है। स्थायी वेक्टर, उदाहरण के लिए, आंशिक अपडेट के लिए ट्री का उपयोग करें। अंतःस्थापित विधि को कॉल करने से कुछ नोड बनेंगे लेकिन सभी नोड नहीं बनेंगे।[76]
अनिवार्य प्रोग्रामिंग की तुलना
कार्यात्मक प्रोग्रामिंग अनिवार्य प्रोग्रामिंग से बहुत अलग है। सबसे महत्वपूर्ण अंतर इस तथ्य से प्राप्त है कि कार्यात्मक प्रोग्रामिंग दुष्प्रभाव (कंप्यूटर विज्ञान) से बचती है, जिसका उपयोग स्थिति और इनपुट/आउटपुट को प्रयुक्त करने के लिए अनिवार्य प्रोग्रामिंग में किया जाता है। शुद्ध कार्यात्मक प्रोग्रामिंग दुष्प्रभाव को पूरी तरह से रोकता है और संदर्भित पारदर्शिता प्रदान करता है।
पुराने अनिवार्य प्रोग्रामिंग में उच्च-क्रम के फ़ंक्शन का उपयोग संभव्यता ही कभी किया जाता है। एक पारंपरिक अनिवार्य फ़ंक्शन किसी सूची को निर्धारित करने और संशोधित करने के लिए लूप का उपयोग कर सकता है। दूसरी ओर, एक कार्यात्मक फ़ंक्शन, संभवतः एक उच्च-क्रम "मानचित्र" फ़ंक्शन का उपयोग करेगा जो प्रत्येक सूची वस्तु में फ़ंक्शन को प्रयुक्त करके एक नई सूची उत्पन्न करने और वापस करने के लिए एक फ़ंक्शन और एक सूची लेता है।
अनिवार्य बनाम कार्यात्मक प्रोग्रामिंग
निम्नलिखित दो उदाहरण (जावास्क्रिप्ट (प्रोग्रामिंग भाषा) में लिखे गए) समान प्रभाव प्राप्त करते हैं: वे एक सरणी में सभी सम संख्याओं को 10 से गुणा करते हैं और उन सभी को जोड़ते हैं, चर परिणाम में अंतिम योग को संग्रहीत करते हैं।
पारंपरिक अनिवार्य लूप:
const numList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let result = 0; for (let i = 0; i < numList.length; i++) { if (numList[i]i% 2 === 0) { result += numList[i] * 10; } }
उच्च-क्रम के फंक्शनों के साथ कार्यात्मक प्रोग्रामिंग:
const result = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
.filter(n => n % 2 === 0) .map(a => a * 10) .reduce((a, b) => a + b);
सिमुलेटिंग स्थिति
ऐसे कार्य हैं (उदाहरण के लिए, बैंक खाते में शेष राशि बनाए रखना) जो प्रायः स्थिति के साथ सबसे स्वाभाविक रूप से प्रयुक्त होते हैं। शुद्ध कार्यात्मक प्रोग्रामिंग इन कार्यों को करती है, और इनपुट/आउटपुट कार्य जैसे कि उपयोगकर्ता इनपुट को स्वीकार करना और स्क्रीन को एक अलग तरीके से प्रिंट करना
शुद्ध कार्यात्मक प्रोग्रामिंग भाषा हास्केल (प्रोग्रामिंग भाषा) श्रेणी सिद्धांत से प्राप्त मोनाड (कार्यात्मक प्रोग्रामिंग) का उपयोग करके उन्हें प्रयुक्त करती है।[77] मोनैड कुछ प्रकार के कम्प्यूटेशनल (संगणनात्मक) पैटर्न को अमूर्त करने का एक तरीका प्रदान करते हैं, जिसमें शुद्धता नष्ट किए बिना एक अनिवार्य तरीके से परिवर्तनशील स्थिति (और अन्य दुष्प्रभाव जैसे इनपुट/आउटपुट) के साथ कंप्यूटेशंस (संगणना) के मॉडलिंग (लेकिन सीमित नहीं) सम्मिलित हैं। जबकि सम्मिलित मोनैड को एक फ़ंक्शन में प्रयुक्त करना आसान हो सकता है, उपयुक्त टेम्प्लेट और उदाहरण दिए गए हैं, कई छात्रों को वैचारिक रूप से समझने में मुश्किल होती है, उदाहरण के लिए, जब नए मोनैड (इकाई) को परिभाषित करने के लिए कहा जाता है (जो कभी-कभी कुछ प्रकार के पुस्तकालयों के लिए आवश्यक होता है)।[78]
कार्यात्मक भाषाएँ भी अपरिवर्तनीय अवस्थाओं को अस्थायी करके स्थितियों का अनुकरण करती हैं। यह एक फ़ंक्शन बनाकर किया जा सकता है जो स्थिति को इसके मापदंडों में से एक के रूप में स्वीकार करता है, और परिणाम के साथ एक नया स्थिति वापस करता है, पुराने स्थिति को अपरिवर्तित छोड़ देता है।[79]
अशुद्ध कार्यात्मक भाषाओं में सामान्य रूप से परिवर्तनशील अवस्था के प्रबंधन का अधिक प्रत्यक्ष तरीका सम्मिलित होता है। क्लोजर, उदाहरण के लिए, प्रबंधित संदर्भों का उपयोग करता है जिसे वर्तमान स्थिति में शुद्ध फंक्शनों को प्रयुक्त करके अपडेट किया जा सकता है। अभिकलन व्यक्त करने के चयनात्मक तरीके के रूप में शुद्ध फंक्शनों के उपयोग को बढ़ावा देते हुए इस तरह का दृष्टिकोण उत्परिवर्तन को सक्षम बनाता है।[citation needed]
प्रोग्रामो में दुष्प्रभाव को निर्धारित करने के लिए होरे तर्क और विशिष्टता जैसे वैकल्पिक तरीके विकसित किए गए हैं। कुछ आधुनिक अनुसंधान भाषाएँ दुष्प्रभाव की उपस्थिति को स्पष्ट करने के लिए प्रभाव प्रणालियों का उपयोग करती हैं।[citation needed]
कार्यक्षमता की समस्या
C (प्रोग्रामिंग भाषा) और पास्कल (प्रोग्रामिंग भाषा) जैसी अनिवार्य भाषाओं की तुलना में कार्यात्मक प्रोग्रामिंग भाषा सामान्य रूप से सेंट्रल प्रोसेसिंग यूनिट और मेमोरी के उपयोग में कम कुशल होती हैं।[80] यह इस तथ्य से संबंधित है कि कुछ परिवर्तनशील डेटा संरचनाओं जैसे सरणियों का वर्तमान हार्डवेयर का उपयोग करके बहुत प्रत्यक्ष रूप से कार्यान्वयन है। स्पष्ट (फ्लैट) सरणियों को गहराई से पाइपलाइन किए गए सेंट्रल प्रोसेसिंग यूनिट के साथ बहुत कुशलता से अभिगम्य किया जा सकता है, कैश के माध्यम से कुशलता से प्रीफेच किया जाता है (बिना जटिल पॉइंटर अनुसरण के), या एकल निर्देश, एकाधिक डेटा (एसआईएमडी) निर्देशों के साथ संभाला जाता है। उनके समान रूप से कुशल सामान्य-उद्देश्य वाले अपरिवर्तनीय समकक्षों को बनाना भी आसान नहीं है। पूर्ण रूप से कार्यात्मक भाषाओं के लिए, उपयोग की जाने वाली मेमोरी सेल की संख्या में सबसे खराब स्थिति लॉगरिदमिक है, क्योंकि अस्थायी (म्यूटेबल) मेमोरी को लॉगरिदमिक अभिगम्य समय (जैसे संतुलित ट्री) के साथ पूरी तरह से कार्यात्मक डेटा संरचना द्वारा दर्शाया जा सकता है।[81] हालांकि, इस तरह का स्लोडाउन (कार्यमंदन) सार्वभौमिक नहीं हैं कंप्यूटर भाषा बेंचमार्क गेम के अनुसार गहन संख्यात्मक संगणना करने वाले प्रोग्रामो के लिए, वस्तुनिष्ठ श्रेणीबद्ध अमूर्त मशीन भाषा और क्लीन (प्रोग्रामिंग भाषा) जैसी कार्यात्मक भाषाएँ C से कुछ मंद हैं।[82] उन प्रोग्रामो के लिए जो बड़े मैट्रिक्स (गणित) और बहुआयामी डेटाबेस को संभालते हैं, सरणी प्रोग्रामिंग कार्यात्मक भाषाएं (जैसे J (प्रोग्रामिंग भाषा) और K (प्रोग्रामिंग भाषा)) को तीव्रता अनुकूलन के साथ डिजाइन किया गया था।
डेटा की अपरिवर्तनीयता कई स्थितियों में संकलक को एक अनिवार्य भाषा में असुरक्षित धारणा बनाने की स्वीकृति देकर निष्पादन दक्षता की ओर ले जा सकती है, इस प्रकार इनलाइन विस्तार के अवसर बढ़ जाते हैं।[83]
मंद (लेज़ी) मूल्यांकन भी फ़ंक्शन को तीव्र कर सकता है, यहां तक कि असम्बद्ध रूप से, जबकि यह एक स्थिर कारक द्वारा अधिकतम मंद हो सकता है (हालांकि, यह अनुपयुक्त तरीके से उपयोग किए जाने पर मेमोरी लीक प्रस्तुत कर सकता है)। लॉन्चबरी 1993[63] मंद मूल्यांकन से मेमोरी लीक से संबंधित सैद्धांतिक समस्याओ पर चर्चा करता है, और ओ'सुलीवन एट अल 2008[84] उनका विश्लेषण करने और उन्हें सही करने के लिए कुछ व्यावहारिक सलाह देते है।
हालांकि, मंद मूल्यांकन का सबसे सामान्य कार्यान्वयन अपसंदर्भित कोड और डेटा का व्यापक उपयोग करता है जो आधुनिक प्रोसेसर पर गहरी पाइपलाइनों और बहु-स्तरीय कैश के साथ खराब प्रदर्शन करता है (जहां एक कैश मिस सैकड़ों चक्रों की कीमत हो सकती है)।[citation needed]
गैर-कार्यात्मक भाषाओं में कार्यात्मक प्रोग्रामिंग
उन भाषाओं में प्रोग्रामिंग की कार्यात्मक शैली का उपयोग करना संभव है जिन्हें पारंपरिक रूप से कार्यात्मक भाषा नहीं माना जाता है।[85] उदाहरण के लिए, दोनों डी (प्रोग्रामिंग भाषा)[86] और फोरट्रान 95[56] स्पष्ट रूप से शुद्ध फंक्शनों का समर्थन करते हैं।
जावास्क्रिप्ट, लुआ (प्रोग्रामिंग भाषा),[87] पायथन (प्रोग्रामिंग भाषा) और गो (प्रोग्रामिंग भाषा)[88] उनकी स्थापना के समय से प्रथम श्रेणी के फ़ंक्शन थे।[89] पायथन को 1994 में "लैम्ब्डा", "मैप", "रिड्यूस", और "फिल्टर" के लिए समर्थन मिला था, साथ ही साथ पायथन 2.2 में क्लोजर भी था[90] हालांकि पायथन 3 ने "रिड्यूस" को functools
मानक लाइब्रेरी मॉड्यूल में परिवर्तित कर दिया।।[91] हाइपरटेक्स्ट पूर्वप्रक्रमक 5.3, विज़ुअल प्रारम्भिक सर्व-उद्देश्यीय प्रतीकात्मक निर्देश कोड 9, C# (प्रोग्रामिंग भाषा) 3.0, C++11, और कोटलिन (प्रोग्रामिंग भाषा) जैसी अन्य मुख्य संचार की भाषाओं में प्रथम श्रेणी के फ़ंक्शन को प्रस्तुत किया गया है।[25][citation needed]
हाइपरटेक्स्ट पूर्वप्रक्रमक में, अज्ञात क्लासेस, क्लोजर (कंप्यूटर विज्ञान) और लैम्ब्डा पूरी तरह से समर्थित हैं। कार्यात्मक शैली में प्रोग्रामिंग की सहायता के लिए अपरिवर्तनीय डेटा संरचनाओं के लिए पुस्तकालय और भाषा विस्तार विकसित किए जा रहे हैं।
जावा (प्रोग्रामिंग भाषा) में, क्लोजर (कंप्यूटर साइंस) का अनुकरण करने के लिए कभी-कभी अज्ञात क्लासेस का उपयोग किया जा सकता है;[92] हालांकि, अज्ञात क्लास सदैव क्लोजर (कंप्यूटर विज्ञान) के लिए उपयुक्त प्रतिस्थापन नहीं होते हैं क्योंकि उनके पास अधिक सीमित क्षमताएं होती हैं।[93] जावा 8 कुछ अज्ञात क्लासेस के प्रतिस्थापन के रूप में लैम्ब्डा पद (एक्सप्रेशन) का समर्थन करता है।[94]
C# (प्रोग्रामिंग भाषा)| में, अज्ञात क्लास आवश्यक नहीं हैं, क्योंकि क्लोजर (कंप्यूटर साइंस) और लैम्ब्डा पूरी तरह से समर्थित हैं। C # में कार्यात्मक शैली में प्रोग्रामिंग की सहायता के लिए अपरिवर्तनीय डेटा संरचनाओं के लिए पुस्तकालय और भाषा एक्सटेंशन विकसित किए जा रहे हैं।
कई वस्तु के उन्मुख डिज़ाइन पैटर्न (कंप्यूटर विज्ञान) कार्यात्मक प्रोग्रामिंग शब्दों में अभिव्यक्त होते हैं: उदाहरण के लिए, योजना पैटर्न केवल एक उच्च-क्रम फ़ंक्शन के उपयोग को निर्देशित करता है, और विज़िटर (डिज़ाइन पैटर्न) पैटर्न सामान्य रूप से एक कैटामोर्फिज़्म, या फोल्ड ( उच्च-क्रम फ़ंक्शन) के अनुरूप है।
इसी तरह, कार्यात्मक प्रोग्रामिंग से अपरिवर्तनीय डेटा का विचार प्रायः अनिवार्य प्रोग्रामिंग भाषाओं में सम्मिलित होता है,[95] उदाहरण के लिए पायथन में टपल, जो एक अपरिवर्तनीय सरणी है, और जावास्क्रिप्ट में ऑब्जेक्ट.फ्रीज() है।[96]
एप्लीकेशन
स्प्रेडशीट
स्प्रेडशीट्स को शुद्ध, उच्च-क्रम फ़ंक्शन शून्य-क्रम, कठिन-मूल्यांकन कार्यात्मक प्रोग्रामिंग प्रणाली का एक रूप माना जा सकता है।[97] हालाँकि, स्प्रेडशीट में सामान्य रूप से उच्च-क्रम के फ़ंक्शन के साथ-साथ कोड का पुन: उपयोग नहीं होता है, और कुछ कार्यान्वयनों में, पुनरावर्तन की भी कमी होती है। उच्च-क्रम और पुन: प्रयोज्य फ़ंक्शन को सक्षम करने के लिए स्प्रैडशीट प्रोग्रामो के लिए कई एक्सटेंशन विकसित किए गए हैं, लेकिन अभी तक प्रकृति में मुख्य रूप से सैद्धान्तिक बने हुए हैं।[98]
शिक्षा
प्रोग्रामिंग भाषा सिद्धांत के क्षेत्र में कार्यात्मक प्रोग्रामिंग अनुसंधान का एक सक्रिय क्षेत्र है। कार्यात्मक प्रोग्रामिंग पर ध्यान केंद्रित करने वाले कई सहकर्मी-समीक्षित प्रकाशन स्थल हैं, जिनमें कार्यात्मक प्रोग्रामिंग पर अंतर्राष्ट्रीय सम्मेलन, कार्यात्मक प्रोग्रामिंग जर्नल और कार्यात्मक प्रोग्रामिंग में प्रवृत्तियों पर संगोष्ठी सम्मिलित है।
उद्योग
कार्यात्मक प्रोग्रामिंग को औद्योगिक उपयोगो की एक विस्तृत श्रृंखला में नियोजित किया गया है। उदाहरण के लिए, एरलांग (प्रोग्रामिंग भाषा), जिसे 1980 के दशक के अंत में स्वीडन की कंपनी एरिक्सन द्वारा विकसित किया गया था, मूल रूप से दोष-सहिष्णु दूरसंचार प्रणाली को प्रयुक्त करने के लिए उपयोग किया गया था।[11] लेकिन तब से नॉर्टेल, फेसबुक, इलेक्ट्रिसिट डी फ्रांस और व्हाट्सप्प जैसी कंपनियों में कई प्रकार के उपयोगो के निर्माण के लिए लोकप्रिय हो गया है।[10][12][99][100][101] स्कीम (प्रोग्रामिंग भाषा), सूची प्रसंस्करण (एलआईएसपी) (प्रोग्रामिंग भाषा) की एक उप-भाषा, का उपयोग प्रारम्भिक एप्पल मैकिंटोश कंप्यूटरों पर कई उपयोगो के लिए आधार के रूप में किया गया था।[3][4]और इसे प्रशिक्षण-कंप्यूटर सिमुलेशन सॉफ्टवेयर और टेलीस्कोप नियंत्रण जैसी समस्याओं पर प्रयुक्त किया गया है[5][6] वस्तुनिष्ठ श्रेणीबद्ध अमूर्त मशीन भाषा, जिसे 1990 के दशक के मध्य में प्रस्तुत किया गया था, इसने वित्तीय विश्लेषण,[14] सॉफ्टवेयर ड्राइवर का सत्यापन, औद्योगिक रोबोट प्रोग्रामिंग और एम्बेडेड सॉफ़्टवेयर के स्थिर विश्लेषण जैसे क्षेत्रों में व्यावसायिक उपयोग देखा है।[15] हास्केल (प्रोग्रामिंग भाषा), हालांकि प्रारंभ में एक शोध भाषा के रूप में अभिप्रेत थी,[17] एयरोस्पेस सिस्टम, हार्डवेयर डिजाइन और वेब प्रोग्रामिंग जैसे क्षेत्रों में भी प्रयुक्त किया गया है।[16][17]
उद्योग में उपयोग की जाने वाली अन्य कार्यात्मक प्रोग्रामिंग भाषाओं में स्काला (प्रोग्रामिंग भाषा),[102] F# (प्रोग्रामिंग भाषा),[18][19] वोल्फ्राम भाषा,[7] सूची प्रसंस्करण (एलआईएसपी) (प्रोग्रामिंग भाषा),[103] मानक मेटा भाषा[104][105] और क्लोजर सम्मिलित है।[106]
कार्यात्मक "प्लेटफ़ॉर्म" वित्त में जोखिम विश्लेषण (विशेष रूप से बड़े निवेश बैंकों के साथ) के लिए लोकप्रिय रहे हैं। जोखिम कारकों को ऐसे फ़ंक्शन के रूप में कोडित किया जाता है जो विक्रय विस्थापन में सहसंबंधों को मापने के लिए अन्योन्याश्रित ग्राफ (श्रेणियां), ग्रोबनर आधार अनुकूलन के तरीके के समान लेकिन व्यापक पूंजी विश्लेषण और समीक्षा जैसे नियामक रूपरेखा के लिए भी बनाते हैं। वित्त में वस्तुनिष्ठ श्रेणीबद्ध अमूर्त मशीन भाषा और श्रेणीबद्ध अमूर्त मशीन भाषा विविधताओं के उपयोग को देखते हुए, इन प्रणालियों को कभी-कभी एक स्पष्ट अमूर्त मशीन से संबंधित माना जाता है। कार्यात्मक प्रोग्रामिंग श्रेणी सिद्धांत से अपेक्षाकृत अधिक प्रभावित है।[citation needed]
शिक्षा
कई विश्वविद्यालय कार्यात्मक प्रोग्रामिंग सिखाते हैं।[107][108][109][110] कुछ इसे एक परिचयात्मक प्रोग्रामिंग अवधारणा के रूप में मानते हैं[110] जबकि अन्य पहले अनिवार्य प्रोग्रामिंग विधियों को सिखाते हैं।[109][111]
कंप्यूटर विज्ञान के बाहर, कार्यात्मक प्रोग्रामिंग का उपयोग समस्या-समाधान, बीजगणितीय और ज्यामितीय अवधारणाओं को सिखाने के लिए किया जाता है।[112] इसका उपयोग उत्कृष्ट यांत्रिकी को पढ़ाने के लिए भी किया गया है, जैसा कि उत्कृष्ट यांत्रिकी की संरचना और व्याख्या पुस्तक में है।
यह भी देखें
- पूर्ण रूप से कार्यात्मक प्रोग्रामिंग
- प्रोग्रामिंग प्रतिमानों की तुलना
- तीव्र मूल्यांकन
- कार्यात्मक प्रोग्रामिंग विषयों की सूची
- नेस्टेड फ़ंक्शन
- आगमनात्मक कार्यात्मक प्रोग्रामिंग
- कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग
संदर्भ
- ↑ Hudak, Paul (September 1989). "Conception, evolution, and application of functional programming languages" (PDF). ACM Computing Surveys. 21 (3): 359–411. doi:10.1145/72551.72554. S2CID 207637854.
- ↑ Jump up to: 2.0 2.1 Hughes, John (1984). "Why Functional Programming Matters".
- ↑ Jump up to: 3.0 3.1 Clinger, Will (1987). "MultiTasking and MacScheme". MacTech. 3 (12). Retrieved 2008-08-28.
- ↑ Jump up to: 4.0 4.1 Hartheimer, Anne (1987). "Programming a Text Editor in MacScheme+Toolsmith". MacTech. 3 (1). Archived from the original on 2011-06-29. Retrieved 2008-08-28.
- ↑ Jump up to: 5.0 5.1 Kidd, Eric. Terrorism Response Training in Scheme. CUFP 2007. Retrieved 2009-08-26.
- ↑ Jump up to: 6.0 6.1 Cleis, Richard. Scheme in Space. CUFP 2006. Retrieved 2009-08-26.
- ↑ Jump up to: 7.0 7.1 "Wolfram Language Guide: Functional Programming". 2015. Retrieved 2015-08-24.
- ↑ "Functional vs. Procedural Programming Language". Department of Applied Math. University of Colorado. Archived from the original on 2007-11-13.
- ↑ "State-Based Scripting in Uncharted 2" (PDF). Archived from the original (PDF) on 2012-12-15. Retrieved 2011-08-08.
- ↑ Jump up to: 10.0 10.1 "Who uses Erlang for product development?". Frequently asked questions about Erlang. Retrieved 2018-04-27.
- ↑ Jump up to: 11.0 11.1 Armstrong, Joe (June 2007). "A history of Erlang". Proceedings of the third ACM SIGPLAN conference on History of programming languages. Third ACM SIGPLAN Conference on History of Programming Languages. San Diego, California. doi:10.1145/1238844.1238850. ISBN 9781595937667.
- ↑ Jump up to: 12.0 12.1 Larson, Jim (March 2009). "Erlang for concurrent programming". Communications of the ACM. 52 (3): 48. doi:10.1145/1467247.1467263. S2CID 524392.
- ↑ "The Elixir Programming Language". Retrieved 2021-02-14.
- ↑ Jump up to: 14.0 14.1 Minsky, Yaron; Weeks, Stephen (July 2008). "Caml Trading — experiences with functional programming on Wall Street". Journal of Functional Programming. 18 (4): 553–564. doi:10.1017/S095679680800676X. S2CID 30955392. Retrieved 2008-08-27.
- ↑ Jump up to: 15.0 15.1 Leroy, Xavier. Some uses of Caml in Industry (PDF). CUFP 2007. Retrieved 2009-08-26.
- ↑ Jump up to: 16.0 16.1 "Haskell in industry". Haskell Wiki. Retrieved 2009-08-26.
Haskell has a diverse range of use commercially, from aerospace and defense, to finance, to web startups, hardware design firms and lawnmower manufacturers.
- ↑ Jump up to: 17.0 17.1 17.2 Hudak, Paul; Hughes, J.; Jones, S. P.; Wadler, P. (June 2007). A history of Haskell: being lazy with class. Third ACM SIGPLAN Conference on History of Programming Languages. San Diego, California. doi:10.1145/1238844.1238856. Retrieved 2013-09-26.
- ↑ Jump up to: 18.0 18.1 Mansell, Howard (2008). Quantitative Finance in F#. CUFP 2008. Retrieved 2009-08-29.
- ↑ Jump up to: 19.0 19.1 Peake, Alex (2009). The First Substantial Line of Business Application in F#. CUFP 2009. Archived from the original on 2009-10-17. Retrieved 2009-08-29.
- ↑ comments, 27 Jun 2017 Matt Banz Feed 603up 2. "An introduction to functional programming in JavaScript". Opensource.com (in English). Retrieved 2021-01-09.
- ↑ "The useR! 2006 conference schedule includes papers on the commercial use of R". R-project.org. 2006-06-08. Retrieved 2011-06-20.
- ↑ Chambers, John M. (1998). Programming with Data: A Guide to the S Language. Springer Verlag. pp. 67–70. ISBN 978-0-387-98503-9.
- ↑ Chamberlin, Donald D.; Boyce, Raymond F. (1974). "SEQUEL: A structured English query language". Proceedings of the 1974 ACM SIGFIDET: 249–264.
- ↑ Functional Programming with C# - Simon Painter - NDC Oslo 2020 (in English), archived from the original on 2021-10-30, retrieved 2021-10-23
- ↑ Jump up to: 25.0 25.1 "Functional programming - Kotlin Programming Language". Kotlin. Retrieved 2019-05-01.
- ↑ Dominus, Mark J. (2005). Higher-Order Perl. Morgan Kaufmann. ISBN 978-1-55860-701-9.
- ↑ Holywell, Simon (2014). Functional Programming in PHP. php[architect]. ISBN 9781940111056.
- ↑ The Cain Gang Ltd. "Python Metaclasses: Who? Why? When?" (PDF). Archived from the original (PDF) on 30 May 2009. Retrieved 27 June 2009.
- ↑ "GopherCon 2020: Dylan Meeus - Functional Programming with Go". YouTube.com.
{{cite web}}
: CS1 maint: url-status (link) - ↑ "Functional Language Features: Iterators and Closures - The Rust Programming Language". doc.rust-lang.org. Retrieved 2021-01-09.
- ↑ Vanderbauwhede, Wim. "Cleaner code with functional programming". Archived from the original on 11 Sep 2020. Retrieved 6 October 2020.
{{cite web}}
:|archive-date=
/|archive-url=
timestamp mismatch (help) - ↑ "Effective Scala". Scala Wiki. Retrieved 2012-02-21.
Effective Scala.
- ↑ "Documentation for package java.util.function since Java 8 (also known as Java 1.8)". Retrieved 2021-06-16.
- ↑ Turing, A. M. (1937). "Computability and λ-definability". The Journal of Symbolic Logic. Cambridge University Press. 2 (4): 153–163. doi:10.2307/2268280. JSTOR 2268280. S2CID 2317046.
- ↑ Haskell Brooks Curry; Robert Feys (1958). Combinatory Logic. North-Holland Publishing Company. Retrieved 10 February 2013.
- ↑ Church, A. (1940). "A Formulation of the Simple Theory of Types". Journal of Symbolic Logic. 5 (2): 56–68. doi:10.2307/2266170. JSTOR 2266170. S2CID 15889861.
- ↑ McCarthy, John (June 1978). History of Lisp (PDF). History of Programming Languages. Los Angeles, CA. pp. 173–185. doi:10.1145/800025.808387.
- ↑ John McCarthy (1960). "Recursive functions of symbolic expressions and their computation by machine, Part I." (PDF). Communications of the ACM. ACM New York, NY, USA. 3 (4): 184–195. doi:10.1145/367177.367199. S2CID 1489409.
- ↑ Guy L. Steele; Richard P. Gabriel (February 1996). The Evolution of Lisp (PDF). pp. 233–330. doi:10.1145/234286.1057818. ISBN 978-0-201-89502-5. S2CID 47047140.
{{cite book}}
:|journal=
ignored (help) - ↑ The memoir of Herbert A. Simon (1991), Models of My Life pp.189-190 ISBN 0-465-04640-1 claims that he, Al Newell, and Cliff Shaw are "...commonly adjudged to be the parents of [the] artificial intelligence [field]," for writing Logic Theorist, a program that proved theorems from Principia Mathematica automatically. To accomplish this, they had to invent a language and a paradigm that, viewed retrospectively, embeds functional programming.
- ↑ Landin, Peter J. (1964). "The mechanical evaluation of expressions". The Computer Journal. British Computer Society. 6 (4): 308–320. doi:10.1093/comjnl/6.4.308.
- ↑ Diehl, Stephan; Hartel, Pieter; Sestoft, Peter (2000). "Abstract machines for programming language implementation". Future Generation Computer Systems. Vol. 16. pp. 739–751.
- ↑ Landin, Peter J. (February 1965a). "Correspondence between ALGOL 60 and Church's Lambda-notation: part I". Communications of the ACM. Association for Computing Machinery. 8 (2): 89–101. doi:10.1145/363744.363749. S2CID 6505810.
- ↑ Landin, Peter J. (March 1965b). "A correspondence between ALGOL 60 and Church's Lambda-notation: part II". Communications of the ACM. Association for Computing Machinery. 8 (3): 158–165. doi:10.1145/363791.363804. S2CID 15781851.
- ↑ Landin, Peter J. (March 1966b). "The next 700 programming languages". Communications of the ACM. Association for Computing Machinery. 9 (3): 157–166. doi:10.1145/365230.365257. S2CID 13409665.
- ↑ Backus, J. (1978). "Can programming be liberated from the von Neumann style?: A functional style and its algebra of programs". Communications of the ACM. 21 (8): 613–641. doi:10.1145/359576.359579.
- ↑ R.M. Burstall. Design considerations for a functional programming language. Invited paper, Proc. Infotech State of the Art Conf. "The Software Revolution", Copenhagen, 45–57 (1977)
- ↑ R.M. Burstall and J. Darlington. A transformation system for developing recursive programs. Journal of the Association for Computing Machinery 24(1):44–67 (1977)
- ↑ R.M. Burstall, D.B. MacQueen and D.T. Sannella. HOPE: an experimental applicative language. Proc. 1980 LISP Conference, Stanford, 136–143 (1980).
- ↑ "Make discovering assign() easier!". OpenSCAD.
- ↑ Peter Bright (March 13, 2018). "Developers love trendy new languages but earn more with functional programming". Ars Technica.
- ↑ John Leonard (January 24, 2017). "The stealthy rise of functional programming". Computing.
- ↑ Leo Cheung (May 9, 2017). "Is functional programming better for your startup?". InfoWorld.
- ↑ Sean Tull - Monoidal Categories for Formal Concept Analysis.
- ↑ Pountain, Dick. "Functional Programming Comes of Age". BYTE.com (August 1994). Archived from the original on 2006-08-27. Retrieved August 31, 2006.
- ↑ Jump up to: 56.0 56.1 "ISO/IEC JTC 1/SC 22/WG5/N2137". International Organization for Standardization. July 6, 2017.
{{cite journal}}
: Cite journal requires|journal=
(help) - ↑ "Revised^6 Report on the Algorithmic Language Scheme". R6rs.org. Retrieved 2013-03-21.
- ↑ "Revised^6 Report on the Algorithmic Language Scheme - Rationale". R6rs.org. Retrieved 2013-03-21.
- ↑ Clinger, William (1998). "Proper tail recursion and space efficiency". Proceedings of the ACM SIGPLAN 1998 conference on Programming language design and implementation - PLDI '98. pp. 174–185. doi:10.1145/277650.277719. ISBN 0897919874. S2CID 16812984.
- ↑ Baker, Henry (1994). "CONS Should Not CONS Its Arguments, Part II: Cheney on the M.T.A."
- ↑ Turner, D.A. (2004-07-28). "Total Functional Programming". Journal of Universal Computer Science. 10 (7): 751–768. doi:10.3217/jucs-010-07-0751.
- ↑ The Implementation of Functional Programming Languages. Simon Peyton Jones, published by Prentice Hall, 1987
- ↑ Jump up to: 63.0 63.1 John Launchbury (1993). "A Natural Semantics for Lazy Evaluation": 144–154. CiteSeerX 10.1.1.35.2016.
{{cite journal}}
: Cite journal requires|journal=
(help) - ↑ Robert W. Harper (2009). Practical Foundations for Programming Languages (PDF). Archived from the original (PDF) on 2016-04-07.
- ↑ Huet, Gérard P. (1973). "The Undecidability of Unification in Third Order Logic". Information and Control. 22 (3): 257–267. doi:10.1016/s0019-9958(73)90301-x.
- ↑ Huet, Gérard (Sep 1976). Resolution d'Equations dans des Langages d'Ordre 1,2,...ω (Ph.D.) (in français). Universite de Paris VII.
- ↑ Huet, Gérard (2002). "Higher Order Unification 30 years later" (PDF). In Carreño, V.; Muñoz, C.; Tahar, S. (eds.). Proceedings, 15th International Conference TPHOL. LNCS. Vol. 2410. Springer. pp. 3–12.
- ↑ Wells, J. B. (1993). "Typability and type checking in the second-order lambda-calculus are equivalent and undecidable". Tech. Rep. 93-011: 176–185. CiteSeerX 10.1.1.31.3590.
- ↑ Leroy, Xavier (17 September 2018). "The Compcert verified compiler".
- ↑ Peyton Jones, Simon; Vytiniotis, Dimitrios; Weirich, Stephanie; Geoffrey Washburn (April 2006). "Simple unification-based type inference for GADTs". Icfp 2006: 50–61.
- ↑ "OCaml Manual". caml.inria.fr. Retrieved 2021-03-08.
{{cite web}}
: CS1 maint: url-status (link) - ↑ "Algebraic Data Types". Scala Documentation. Retrieved 2021-03-08.
- ↑ Kennedy, Andrew; Russo, Claudio (October 2005). Generalized Algebraic Data Types and Object-Oriented Programming (PDF). ISBN 9781595930316. Archived from the original (PDF) on 2006-12-29.
{{cite book}}
:|work=
ignored (help)CS1 maint: location missing publisher (link) source of citation - ↑ Hughes, John. "Why Functional Programming Matters" (PDF). Chalmers University of Technology.
- ↑ Purely functional data structures by Chris Okasaki, Cambridge University Press, 1998, ISBN 0-521-66350-4
- ↑ L’orange, Jean Niklas. "polymatheia - Understanding Clojure's Persistent Vector, pt. 1". Polymatheia. Retrieved 2018-11-13.
- ↑ Michael Barr, Charles Well - Category theory for computer science.
- ↑ Newbern, J. "All About Monads: A comprehensive guide to the theory and practice of monadic programming in Haskell". Retrieved 2008-02-14.
- ↑ "Thirteen ways of looking at a turtle". fF# for fun and profit (in English). Retrieved 2018-11-13.
- ↑ Paulson, Larry C. (28 June 1996). ML for the Working Programmer. Cambridge University Press. ISBN 978-0-521-56543-1. Retrieved 10 February 2013.
- ↑ Spiewak, Daniel (26 August 2008). "Implementing Persistent Vectors in Scala". Code Commit.
- ↑ "Which programs are fastest? | Computer Language Benchmarks Game". benchmarksgame.alioth.debian.org. Archived from the original on 2013-05-20. Retrieved 2011-06-20.
- ↑ Igor Pechtchanski; Vivek Sarkar (2005). "Immutability specification and its applications". Concurrency and Computation: Practice and Experience. 17 (5–6): 639–662. doi:10.1002/cpe.853. S2CID 34527406.
- ↑ "Chapter 25. Profiling and optimization". Book.realworldhaskell.org. Retrieved 2011-06-20.
- ↑ Hartel, Pieter; Henk Muller; Hugh Glaser (March 2004). "The Functional C experience" (PDF). Journal of Functional Programming. 14 (2): 129–135. doi:10.1017/S0956796803004817. S2CID 32346900.; David Mertz. "Functional programming in Python, Part 3". IBM developerWorks. Archived from the original on 2007-10-16. Retrieved 2006-09-17.(Part 1, Part 2)
- ↑ "Functions — D Programming Language 2.0". Digital Mars. 30 December 2012.
- ↑ "Lua Unofficial FAQ (uFAQ)".
- ↑ "First-Class Functions in Go - The Go Programming Language". golang.org. Retrieved 2021-01-04.
- ↑ Eich, Brendan (3 April 2008). "लोकप्रियता".
- ↑ van Rossum, Guido (2009-04-21). "Origins of Python's "Functional" Features". Retrieved 2012-09-27.
- ↑ "functools — Higher order functions and operations on callable objects". Python Software Foundation. 2011-07-31. Retrieved 2011-07-31.
- ↑ Skarsaune, Martin (2008). The SICS Java Port Project Automatic Translation of a Large Object Oriented System from Smalltalk to Java.
- ↑ Gosling, James. "बंद". James Gosling: on the Java Road. Oracle. Archived from the original on 2013-04-14. Retrieved 11 May 2013.
- ↑ Williams, Michael (8 April 2013). "Java SE 8 Lambda Quick Start".
- ↑ Bloch, Joshua (2008). "Item 15: Minimize Mutability". Effective Java (Second ed.). Addison-Wesley. ISBN 978-0321356680.
- ↑ "Object.freeze() - JavaScript | MDN". developer.mozilla.org. Retrieved 2021-01-04.
The Object.freeze() method freezes an object. A frozen object can no longer be changed; freezing an object prevents new properties from being added to it, existing properties from being removed, prevents changing the enumerability, configurability, or writability of existing properties, and prevents the values of existing properties from being changed. In addition, freezing an object also prevents its prototype from being changed. freeze() returns the same object that was passed in.
{{cite web}}
: CS1 maint: url-status (link) - ↑ Wakeling, David (2007). "Spreadsheet functional programming" (PDF). Journal of Functional Programming. 17 (1): 131–143. doi:10.1017/S0956796806006186. ISSN 0956-7968. S2CID 29429059.
- ↑ Peyton Jones, Simon; Burnett, Margaret; Blackwell, Alan (March 2003). "Improving the world's most popular functional language: user-defined functions in Excel". Archived from the original on 2005-10-16.
- ↑ Piro, Christopher (2009). Functional Programming at Facebook. CUFP 2009. Archived from the original on 2009-10-17. Retrieved 2009-08-29.
- ↑ "Sim-Diasca: a large-scale discrete event concurrent simulation engine in Erlang". November 2011.
- ↑ 1 million is so 2011 Archived 2014-02-19 at the Wayback Machine // WhatsApp blog, 2012-01-06: "the last important piece of our infrastracture is Erlang"
- ↑ Momtahan, Lee (2009). Scala at EDF Trading: Implementing a Domain-Specific Language for Derivative Pricing with Scala. CUFP 2009. Archived from the original on 2009-10-17. Retrieved 2009-08-29.
- ↑ Graham, Paul (2003). "Beating the Averages". Retrieved 2009-08-29.
- ↑ Sims, Steve (2006). Building a Startup with Standard ML (PDF). CUFP 2006. Retrieved 2009-08-29.
- ↑ Laurikari, Ville (2007). Functional Programming in Communications Security. CUFP 2007. Retrieved 2009-08-29.
- ↑ Lorimer, R. J. (19 January 2009). "Live Production Clojure Application Announced". InfoQ.
- ↑ "Functional Programming: 2019-2020". University of Oxford Department of Computer Science. Retrieved 28 April 2020.
- ↑ "Programming I (Haskell)". Imperial College London Department of Computing. Retrieved 28 April 2020.
- ↑ Jump up to: 109.0 109.1 "Computer Science BSc - Modules". Retrieved 28 April 2020.
- ↑ Jump up to: 110.0 110.1 Abelson, Hal; Sussman, Gerald Jay (1985). "Preface to the Second Edition". Structure and Interpretation of Computer Programs (2 ed.). MIT Press.
- ↑ John DeNero (Fall 2019). "Computer Science 61A, Berkeley". Department of Electrical Engineering and Computer Sciences, Berkeley. Retrieved 2020-08-14.
- ↑ Emmanuel Schanzer of Bootstrap interviewed on the TV show Triangulation on the TWiT.tv network
Cite error: <ref>
tag with name "Novatchev" defined in <references>
is not used in prior text.
<ref>
tag with name "Mertz" defined in <references>
is not used in prior text.
अग्रिम पठन
- Abelson, Hal; Sussman, Gerald Jay (1985). Structure and Interpretation of Computer Programs. MIT Press.
- Cousineau, Guy and Michel Mauny. The Functional Approach to Programming. Cambridge, UK: Cambridge University Press, 1998.
- Curry, Haskell Brooks and Feys, Robert and Craig, William. Combinatory Logic. Volume I. North-Holland Publishing Company, Amsterdam, 1958.
- Curry, Haskell B.; Hindley, J. Roger; Seldin, Jonathan P. (1972). Combinatory Logic. Vol. II. Amsterdam: North Holland. ISBN 978-0-7204-2208-5.
- Dominus, Mark Jason. Higher-Order Perl. Morgan Kaufmann. 2005.
- Felleisen, Matthias; Findler, Robert; Flatt, Matthew; Krishnamurthi, Shriram (2001). How to Design Programs. MIT Press.
- Graham, Paul. ANSI Common LISP. Englewood Cliffs, New Jersey: Prentice Hall, 1996.
- MacLennan, Bruce J. Functional Programming: Practice and Theory. Addison-Wesley, 1990.
- Michaelson, Greg (10 April 2013). An Introduction to Functional Programming Through Lambda Calculus (in English). Courier Corporation. ISBN 978-0-486-28029-5.[1]
- O'Sullivan, Brian; Stewart, Don; Goerzen, John (2008). Real World Haskell. O'Reilly.
- Pratt, Terrence W. and Marvin Victor Zelkowitz. Programming Languages: Design and Implementation. 3rd ed. Englewood Cliffs, New Jersey: Prentice Hall, 1996.
- Salus, Peter H. Functional and Logic Programming Languages. Vol. 4 of Handbook of Programming Languages. Indianapolis, Indiana: Macmillan Technical Publishing, 1998.
- Thompson, Simon. Haskell: The Craft of Functional Programming. Harlow, England: Addison-Wesley Longman Limited, 1996.
बाहरी संबंध
- Ford, Neal. "Functional thinking". Retrieved 2021-11-10.
- Akhmechet, Slava (2006-06-19). "defmacro – Functional Programming For The Rest of Us". Retrieved 2013-02-24. An introduction
- Functional programming in Python (by David Mertz): part 1, part 2, part 3
- ↑ "Greg Michaelson's Homepage". Mathematical and Computer Sciences. Riccarton, Edinburgh: Heriot-Watt University. Retrieved 6 November 2022.