फंक्शनल प्रोग्रामिंग

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

कार्यात्मक प्रोग्रामिंग में, कार्यों को प्रथम श्रेणी के नागरिकों के रूप में माना जाता है, जिसका अर्थ है कि वे नामों (स्थानीय पहचानकर्ता (कंप्यूटर भाषाओं) सहित) के लिए बाध्य हो सकते हैं, पैरामीटर (कंप्यूटर प्रोग्रामिंग) के रूप में पारित हो सकते हैं, और अन्य कार्यों से वापसी मूल्य, किसी अन्य के रूप में डेटा प्रकार कर सकते हैं। यह प्रोग्राम को घोषणात्मक प्रोग्रामिंग और संगति शैली में लिखे जाने की स्वीकृति देता है, जहां छोटे कार्यों को एक मॉड्यूलर प्रोग्रामिंग तरीके से जोड़ा जाता है।

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

कार्यात्मक प्रोग्रामिंग की जड़ें अकादमिया में हैं, जो लैम्ब्डा कैलकुलस से विकसित होती है, जो केवल कार्यों पर आधारित संगणना की एक औपचारिक प्रणाली है। योजना (प्रोग्रामिंग भाषा) तुलना में कार्यात्मक प्रोग्रामिंग ऐतिहासिक रूप से कम लोकप्रिय रही है, लेकिन आज उद्योग और शिक्षा में कई कार्यात्मक भाषाओं का उपयोग देखा जा रहा है, जिसमें सामान्य लिस्प, स्कीम (प्रोग्रामिंग लैंग्वेज),   क्लोजर, वोल्फ्राम भाषा, रैकेट (प्रोग्रामिंग भाषा), एरलांग (प्रोग्रामिंग भाषा),  अमृत ​​​​(प्रोग्रामिंग भाषा), OCaml,  हास्केल (प्रोग्रामिंग भाषा), और एफ शार्प (प्रोग्रामिंग लैंग्वेज) | एफ #।  कार्यात्मक प्रोग्रामिंग भी कुछ भाषाओं के लिए महत्वपूर्ण है, जिन्हें विशिष्ट डोमेन में सफलता मिली है, जैसे वेब में जावास्क्रिप्ट, आँकड़ों में आर (प्रोग्रामिंग भाषा),  J (प्रोग्रामिंग लैंग्वेज), K (प्रोग्रामिंग लैंग्वेज) और Q (Kx सिस्टम्स कश्मीर (प्रोग्रामिंग भाषा)) वित्तीय विश्लेषण में, और XML के लिए XQuery / XSLT।  SQL और Lex (सॉफ़्टवेयर)/Yacc जैसी डोमेन-विशिष्ट घोषणात्मक भाषाएँ कार्यात्मक प्रोग्रामिंग के कुछ तत्वों का उपयोग करती हैं, जैसे कि परिवर्तनशील वस्तु की स्वीकृति नहीं देना। इसके अलावा, कई अन्य प्रोग्रामिंग भाषाएं कार्यात्मक शैली में प्रोग्रामिंग का समर्थन करती हैं या कार्यात्मक प्रोग्रामिंग से सुविधाओं को कार्यान्वित करती हैं, जैसे सी ++ 11, सी शार्प (प्रोग्रामिंग भाषा) | सी#, कोटलिन (प्रोग्रामिंग भाषा), पर्ल, पीएचपी, पायथन (प्रोग्रामिंग भाषा), जाओ (प्रोग्रामिंग भाषा), जंग (प्रोग्रामिंग भाषा), राकू (प्रोग्रामिंग भाषा), स्काला (प्रोग्रामिंग भाषा), और जावा (प्रोग्रामिंग भाषा) | जावा (जावा 8 के बाद से)।

इतिहास
अलोंजो चर्च द्वारा 1930 के दशक में विकसित लैम्ब्डा कैलकुलस, कार्यात्मक एप्लीकेशन से निर्मित संगणना की एक औपचारिक प्रणाली है। 1937 में एलन ट्यूरिंग ने साबित किया कि लैम्ब्डा कैलकुलस और ट्यूरिंग मशीनें संगणना के समकक्ष मॉडल हैं, दिखा रहा है कि लैम्ब्डा कैलकुस ट्यूरिंग पूर्ण है। लैम्ब्डा कैलकुस सभी कार्यात्मक प्रोग्रामिंग भाषाओं का आधार बनाता है। 1920 और 1930 के दशक में मूसा शॉनफिंकेल और हास्केल करी द्वारा एक समकक्ष सैद्धांतिक सूत्रीकरण, संयोजन तर्क विकसित किया गया था। चर्च ने बाद में एक कमजोर प्रणाली विकसित की, सामान्य रूप से टाइप किया गया लैम्ब्डा कैलकुलस, जिसने लैम्ब्डा कैलकुलस को सभी शब्दों के लिए एक प्रकार (कंप्यूटर विज्ञान) निर्दिष्ट करके बढ़ाया। यह सांख्यिकीय रूप से टाइप किए गए कार्यात्मक प्रोग्रामिंग के लिए आधार बनाता है।

पहली उच्च-स्तरीय प्रोग्रामिंग भाषा | उच्च-स्तरीय कार्यात्मक प्रोग्रामिंग भाषा, लिस्प (प्रोग्रामिंग भाषा), 1950 के दशक के अंत में IBM 700/7000 श्रृंखला#वैज्ञानिक वास्तुकला|IBM 700/7000 श्रृंखला के वैज्ञानिक कंप्यूटरों के लिए जॉन मैकार्थी द्वारा विकसित की गई थी ( कंप्यूटर वैज्ञानिक) जबकि मैसाचुसेट्स की तकनीकी संस्था (एमआईटी) में। एलआईएसपी कार्यों को चर्च के लैम्ब्डा नोटेशन का उपयोग करके परिभाषित किया गया था, जिसे रिकर्सन (कंप्यूटर विज्ञान) कार्यों की स्वीकृति देने के लिए एक लेबल निर्माण के साथ विस्तारित किया गया था। लिस्प ने पहले कार्यात्मक प्रोग्रामिंग की कई प्रतिमानों की प्रारंभ की, हालांकि प्रारम्भिक लिस्प्स प्रोग्रामिंग प्रतिमान #Multi-paradigm|multi-paradigm भाषाएं थीं, और कई प्रोग्रामिंग शैलियों के लिए नए प्रतिमान विकसित होने के लिए समर्थन सम्मिलित था। बाद की बोलियाँ, जैसे कि स्कीम (प्रोग्रामिंग लैंग्वेज) और क्लोजर, और ऑफ़शूट्स जैसे डायलन (प्रोग्रामिंग भाषा) और जूलिया (प्रोग्रामिंग भाषा), ने लिस्प को एक स्वच्छ कार्यात्मक कोर के आसपास सरल और युक्तिसंगत बनाने की मांग की, जबकि कॉमन लिस्प को संरक्षित और अपडेट करने के लिए डिज़ाइन किया गया था। इसके द्वारा प्रतिस्थापित कई पुरानी बोलियों की प्रतिमानात्मक विशेषताएं। सूचना प्रसंस्करण भाषा (आईपीएल), 1956, को कभी-कभी पहली कंप्यूटर-आधारित कार्यात्मक प्रोग्रामिंग भाषा के रूप में उद्धृत किया जाता है। यह एक असेंबली भाषा है | प्रतीकों की सूची में हेरफेर करने के लिए असेंबली-शैली की भाषा। इसमें जनरेटर की धारणा है, जो एक फ़ंक्शन के बराबर है जो फ़ंक्शन को तर्क के रूप में स्वीकार करता है, और चूंकि यह एक असेंबली-स्तरीय भाषा है, कोड डेटा हो सकता है, इसलिए आईपीएल को उच्च-क्रम के कार्यों के रूप में माना जा सकता है। हालाँकि, यह परिवर्तनशील सूची संरचना और समान अनिवार्य विशेषताओं पर बहुत अधिक निर्भर करता है।

केनेथ ई. इवरसन ने 1960 के दशक की प्रारंभ में एपीएल (प्रोग्रामिंग भाषा) का विकास किया, जिसका वर्णन उनकी 1962 की पुस्तक ए प्रोग्रामिंग लैंग्वेज (ए प्रोग्रामिंग लैंग्वेज) में किया गया है।ISBN 9780471430148). जॉन बैकस की एफपी (प्रोग्रामिंग भाषा) पर एपीएल का प्राथमिक प्रभाव था। 1990 के दशक की प्रारंभ में, आइवरसन और रोजर हुई ने J (प्रोग्रामिंग लैंग्वेज) बनाई। 1990 के दशक के मध्य में, आर्थर व्हिटनी (कंप्यूटर वैज्ञानिक), जिन्होंने पहले आइवरसन के साथ काम किया था, ने K (प्रोग्रामिंग लैंग्वेज) बनाई, जिसका उपयोग वित्तीय उद्योगों में व्यावसायिक रूप से इसके वंशज Q (Kx सिस्टम्स से प्रोग्रामिंग लैंग्वेज) के साथ किया जाता है।

1960 के दशक के मध्य में, पीटर लैंडिन ने SECD मशीन का आविष्कार किया, कार्यात्मक प्रोग्रामिंग भाषा के लिए पहली अमूर्त मशीन, ALGOL 60 और लैम्ब्डा कैलकुलस के बीच एक पत्राचार का वर्णन किया, और ISWIM प्रोग्रामिंग भाषा प्रस्तावित की। जॉन बैकस ने अपने 1977 के ट्यूरिंग अवार्ड व्याख्यान में एफपी (प्रोग्रामिंग लैंग्वेज) प्रस्तुत किया क्या प्रोग्रामिंग को वॉन न्यूमैन वास्तुकला शैली से मुक्त किया जा सकता है? एक कार्यात्मक शैली और इसके कार्यक्रमों का बीजगणित। वह कार्यात्मक कार्यक्रमों को एक पदानुक्रमित तरीके से उन रूपों के संयोजन के रूप में परिभाषित करता है जो कार्यक्रमों के बीजगणित की स्वीकृति देते हैं; आधुनिक भाषा में, इसका मतलब है कि कार्यात्मक फ़ंक्शन संरचना के सिद्धांत का पालन करते हैं। बैकस के पेपर ने कार्यात्मक प्रोग्रामिंग में अनुसंधान को लोकप्रिय बनाया, हालांकि इसने लैम्ब्डा-कैलकुलस शैली के बजाय फंक्शन-लेवल प्रोग्रामिंग पर जोर दिया, जो अब कार्यात्मक प्रोग्रामिंग से जुड़ा हुआ है।

1973 की भाषा ML (प्रोग्रामिंग भाषा) एडिनबर्ग विश्वविद्यालय में रॉबिन मिलनर द्वारा बनाई गई थी, और डेविड टर्नर (कंप्यूटर वैज्ञानिक) ने सेंट एंड्रयूज विश्वविद्यालय में भाषा SASL (प्रोग्रामिंग भाषा) विकसित की थी। 1970 के दशक में एडिनबर्ग में भी, बर्स्टॉल और डार्लिंगटन ने कार्यात्मक भाषा एनपीएल (प्रोग्रामिंग भाषा) विकसित की। एनपीएल क्लेन के पुनरावर्तन प्रमेय पर आधारित था और पहली बार फ़ंक्शन परिवर्तन पर उनके काम में पेश किया गया था। बर्स्टल, मैकक्वीन और सन्नेला ने फिर भाषा होप (प्रोग्रामिंग भाषा) का उत्पादन करने के लिए एमएल से बहुरूपी प्रकार की जाँच को सम्मिलित किया। एमएल अंततः कई बोलियों में विकसित हुआ, जिनमें से सबसे आम अब OCaml और Standard ML हैं।

1970 के दशक में, गाय एल. स्टील और गेराल्ड जे सुस्मान ने योजना (प्रोग्रामिंग भाषा) विकसित की, जैसा कि लैम्ब्डा पेपर्स और 1985 की पाठ्यपुस्तक संरचना और कंप्यूटर प्रोग्राम की व्याख्या में वर्णित है। योजना लिस्प की पहली बोली थी जिसमें शाब्दिक दायरे का उपयोग किया गया था और टेल-कॉल ऑप्टिमाइज़ेशन की आवश्यकता थी, ऐसी विशेषताएं जो कार्यात्मक प्रोग्रामिंग को प्रोत्साहित करती हैं।

1980 के दशक में, प्रति मार्टिन-लोफ ने अंतर्ज्ञानवादी प्रकार सिद्धांत (जिसे रचनात्मक प्रकार सिद्धांत भी कहा जाता है) विकसित किया, जो आश्रित प्रकार के रूप में व्यक्त रचनात्मक प्रमाणों के साथ कार्यात्मक फ़ंक्शन से जुड़ा था। इसने इंटरैक्टिव प्रमेय साबित करने के लिए नए दृष्टिकोणों को जन्म दिया और बाद की कार्यात्मक प्रोग्रामिंग भाषाओं के विकास को प्रभावित किया। डेविड टर्नर द्वारा विकसित आलसी कार्यात्मक भाषा, मिरांडा (प्रोग्रामिंग भाषा), शुरू में 1985 में दिखाई दी और हास्केल (प्रोग्रामिंग भाषा) पर इसका गहरा प्रभाव था। मिरांडा के मालिकाना हक के साथ, हास्केल ने कार्यात्मक प्रोग्रामिंग अनुसंधान के लिए एक खुला मानक बनाने के लिए 1987 में एक आम सहमति के साथ प्रारंभ की; कार्यान्वयन रिलीज़ 1990 से जारी है।

हाल ही में इसे CGAL फ्रेमवर्क पर निर्मित OpenSCAD भाषा में पैरामीट्रिक कंप्यूटर एडेड डिजाइन जैसे निचेस में उपयोग किया गया है, हालाँकि मानों को पुन: असाइन करने पर प्रतिबंध (सभी मानों को स्थिरांक के रूप में माना जाता है) ने उन उपयोगकर्ताओं के बीच भ्रम पैदा किया है जो कार्यात्मक प्रोग्रामिंग से अपरिचित हैं। एक अवधारणा के रूप में। व्यावसायिक सेटिंग में कार्यात्मक प्रोग्रामिंग का उपयोग जारी है।

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

प्रथम श्रेणी और उच्च क्रम के कार्य
उच्च-क्रम के कार्य ऐसे कार्य हैं जो या तो अन्य कार्यों को तर्क के रूप में ले सकते हैं या उन्हें परिणाम के रूप में वापस कर सकते हैं। कलन में, उच्च-क्रम फलन का एक उदाहरण अवकल संकारक है $$d/dx$$, जो किसी फ़ंक्शन का यौगिक लौटाता है $$f$$.

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

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

शुद्ध कार्य
शुद्ध कार्यों (या भाव) का कोई दुष्प्रभाव नहीं है (कंप्यूटर विज्ञान) (मेमोरी या आई/ओ)। इसका अर्थ है कि शुद्ध कार्यों में कई उपयोगी गुण होते हैं, जिनमें से कई का उपयोग कोड को अनुकूलित करने के लिए किया जा सकता है:
 * यदि किसी शुद्ध व्यंजक के परिणाम का उपयोग नहीं किया जाता है, तो इसे अन्य व्यंजकों को प्रभावित किए बिना हटाया जा सकता है।
 * यदि एक शुद्ध कार्य को उन तर्कों के साथ कहा जाता है जो बिना किसी दुष्प्रभाव का कारण बनते हैं, तो परिणाम उस तर्क सूची के संबंध में स्थिर होता है (कभी-कभी संदर्भित पारदर्शिता या निष्क्रियता कहा जाता है), यानी, शुद्ध कार्य को फिर से उसी तर्क के साथ बुलाकर वही परिणाम देता है . (यह कैशिंग ऑप्टिमाइज़ेशन जैसे memoization को सक्षम कर सकता है।)
 * यदि दो शुद्ध भावों के बीच कोई डेटा निर्भरता नहीं है, तो उनके क्रम को उलटा किया जा सकता है, या उन्हें समानांतर में किया जा सकता है और वे एक दूसरे के साथ हस्तक्षेप नहीं कर सकते हैं (दूसरे शब्दों में, किसी भी शुद्ध अभिव्यक्ति का मूल्यांकन थ्रेड-सुरक्षित है)।
 * यदि संपूर्ण भाषा दुष्प्रभाव की स्वीकृति नहीं देती है, तो किसी भी मूल्यांकन रणनीति का उपयोग किया जा सकता है; यह संकलक को एक फ़ंक्शन में भावों के मूल्यांकन को पुनर्व्यवस्थित करने या संयोजित करने की स्वतंत्रता देता है (उदाहरण के लिए, वनों की कटाई (कंप्यूटर विज्ञान) का उपयोग करके)।

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

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

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

पुनरावर्तन के सामान्य पैटर्न को उच्च-क्रम के कार्यों का उपयोग करके दूर किया जा सकता है, जिसमें catamorphism और एनामॉर्फिज्म (या फोल्ड और अनफोल्ड) सबसे स्पष्ट उदाहरण हैं। इस तरह की पुनरावर्तन योजनाएँ अनिवार्य भाषाओं में प्रोग्राम लूप्स जैसे अंतर्निहित नियंत्रण संरचनाओं के अनुरूप भूमिका निभाती हैं।

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

सख्त बनाम गैर-सख्त मूल्यांकन
कार्यात्मक भाषाओं को वर्गीकृत किया जा सकता है कि क्या वे सख्त (उत्सुक) या गैर-सख्त (आलसी) मूल्यांकन का उपयोग करते हैं, अवधारणाएं जो दर्शाती हैं कि फ़ंक्शन तर्कों को कैसे संसाधित किया जाता है जब एक अभिव्यक्ति का मूल्यांकन किया जा रहा है। तकनीकी अंतर असफल या अलग-अलग संगणनाओं वाले भावों के सांकेतिक शब्दार्थ में है। सख्त मूल्यांकन के तहत, किसी भी शब्द का असफल उपपद वाला मूल्यांकन विफल हो जाता है। उदाहरण के लिए, अभिव्यक्ति:

प्रिंट लंबाई ([2+1, 3*2, 1/0, 5-4])

सूची के तीसरे तत्व में शून्य से विभाजन के कारण कड़े मूल्यांकन के तहत विफल रहता है। आलसी मूल्यांकन के तहत, लम्बाई फ़ंक्शन मान 4 (यानी, सूची में वस्तुओं की संख्या) देता है, क्योंकि इसका मूल्यांकन करने से सूची बनाने वाली शर्तों का मूल्यांकन करने का प्रयास नहीं होता है। संक्षेप में, सख्त मूल्यांकन हमेशा फ़ंक्शन को प्रयुक्त करने से पहले फ़ंक्शन के तर्कों का पूरी तरह से मूल्यांकन करता है। आलसी मूल्यांकन फ़ंक्शन तर्कों का मूल्यांकन नहीं करता है जब तक कि फ़ंक्शन कॉल का मूल्यांकन करने के लिए उनके मानों की आवश्यकता न हो।

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

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

सिस्टम टाइप करें
विशेष रूप से 1970 के दशक में हिंडले-मिलनर प्रकार के अनुमान के विकास के बाद से, कार्यात्मक प्रोग्रामिंग भाषाओं में टाइप किए गए लैम्ब्डा कैलकुलस का उपयोग करने की प्रवृत्ति रही है, संकलन समय पर सभी अमान्य कार्यक्रमों को खारिज कर दिया और झूठे सकारात्मक और झूठे नकारात्मक #गलत सकारात्मक त्रुटि को जोखिम में डाल दिया, जैसा कि अप्रकाशित लैम्ब्डा के विपरीत है। कलन, जो संकलन समय पर सभी वैध कार्यक्रमों को स्वीकार करता है और झूठे सकारात्मक और झूठे नकारात्मक #गलत नकारात्मक त्रुटि का जोखिम उठाता है, जिसका उपयोग लिस्प और इसके रूपों (जैसे योजना (प्रोग्रामिंग भाषा)) में किया जाता है, क्योंकि वे रनटाइम पर सभी अमान्य कार्यक्रमों को अस्वीकार करते हैं जब जानकारी होती है वैध कार्यक्रमों को अस्वीकार न करने के लिए पर्याप्त। बीजगणितीय डेटाटाइप्स का उपयोग जटिल डेटा संरचनाओं के हेरफेर को सुविधाजनक बनाता है; मजबूत संकलन-समय प्रकार की जाँच की उपस्थिति परीक्षण-संचालित विकास जैसी अन्य विश्वसनीयता तकनीकों के अभाव में कार्यक्रमों को अधिक विश्वसनीय बनाती है, जबकि प्रकार अनुमान प्रोग्रामर को अधिकांश मामलों में संकलक को मैन्युअल रूप से प्रकार घोषित करने की आवश्यकता से मुक्त करता है।

कुछ शोध-उन्मुख कार्यात्मक भाषाएं जैसे Coq, Agda (प्रमेय समर्थक), केयेन (प्रोग्रामिंग भाषा), और एपिग्राम (प्रोग्रामिंग भाषा) अंतर्ज्ञानवादी प्रकार के सिद्धांत पर आधारित हैं, जो प्रकारों को शर्तों पर निर्भर करती हैं। ऐसे प्रकारों को आश्रित प्रकार कहा जाता है। इस प्रकार की प्रणालियों में निर्णायक प्रकार का अनुमान नहीं होता है और इन्हें समझना और प्रोग्राम करना मुश्किल होता है।   लेकिन आश्रित प्रकार उच्च-क्रम तर्क में मनमाना प्रस्ताव व्यक्त कर सकते हैं। करी-हावर्ड समरूपता के माध्यम से, इन भाषाओं में अच्छी तरह से टाइप किए गए फ़ंक्शन औपचारिक गणितीय प्रमाण लिखने का एक साधन बन जाते हैं जिससे एक संकलक औपचारिक सत्यापन उत्पन्न कर सकता है। जबकि ये भाषाएँ मुख्य रूप से अकादमिक अनुसंधान (औपचारिक गणित सहित) में रुचि रखती हैं, इंजीनियरिंग में भी इनका उपयोग शुरू हो गया है। Compcert C (प्रोग्रामिंग लैंग्वेज) के एक सबसेट के लिए एक कंपाइलर है जो Coq में लिखा गया है और औपचारिक रूप से सत्यापित है। सामान्यीकृत बीजगणितीय डेटा प्रकार (GADT's) कहे जाने वाले आश्रित प्रकारों का एक सीमित रूप इस तरह से प्रयुक्त किया जा सकता है जो इसकी अधिकांश असुविधाओं से बचते हुए निर्भर रूप से टाइप की गई प्रोग्रामिंग के कुछ लाभ प्रदान करता है। जीएडीटी ओकैमल में ग्लासगो हास्केल कंपाइलर में उपलब्ध हैं और स्काला (प्रोग्रामिंग भाषा) में, और जावा और सी # सहित अन्य भाषाओं में परिवर्धन के रूप में प्रस्तावित किया गया है।

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

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

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

अनिवार्य प्रोग्रामिंग की तुलना
कार्यात्मक प्रोग्रामिंग अनिवार्य प्रोग्रामिंग से बहुत अलग है। सबसे महत्वपूर्ण अंतर इस तथ्य से उपजा है कि कार्यात्मक प्रोग्रामिंग साइड इफेक्ट (कंप्यूटर विज्ञान) से बचती है, जिसका उपयोग राज्य और I/O को प्रयुक्त करने के लिए अनिवार्य प्रोग्रामिंग में किया जाता है। शुद्ध कार्यात्मक प्रोग्रामिंग साइड-इफेक्ट्स को पूरी तरह से रोकता है और संदर्भित पारदर्शिता प्रदान करता है।

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

अनिवार्य बनाम कार्यात्मक प्रोग्रामिंग
निम्नलिखित दो उदाहरण (जावास्क्रिप्ट (प्रोग्रामिंग भाषा) में लिखे गए) समान प्रभाव प्राप्त करते हैं: वे एक सरणी में सभी सम संख्याओं को 10 से गुणा करते हैं और उन सभी को जोड़ते हैं, चर परिणाम में अंतिम योग को संग्रहीत करते हैं।

पारंपरिक इंपीरेटिव लूप: <वाक्यविन्यास लैंग = जावास्क्रिप्ट> const numList = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; चलो परिणाम = 0; के लिए (चलो मैं = 0; मैं 

उच्च-क्रम के कार्यों के साथ कार्यात्मक प्रोग्रामिंग: <वाक्यविन्यास लैंग = जावास्क्रिप्ट> स्थिरांक परिणाम = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] फ़िल्टर (एन => एन% 2 === 0) .नक्शा (ए => ए * 10) कम करें ((ए, बी) => ए + बी); 

सिमुलेटिंग राज्य
ऐसे कार्य हैं (उदाहरण के लिए, बैंक खाते में शेष राशि बनाए रखना) जो प्रायः राज्य के साथ सबसे स्वाभाविक रूप से प्रयुक्त होते हैं। शुद्ध कार्यात्मक प्रोग्रामिंग इन कार्यों को करती है, और I/O कार्य जैसे कि उपयोगकर्ता इनपुट को स्वीकार करना और स्क्रीन पर प्रिंट करना, एक अलग तरीके से।

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

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

कार्यक्रमों में साइड इफेक्ट को ट्रैक करने के लिए होरे तर्क और विशिष्टता प्रकार जैसे वैकल्पिक तरीके विकसित किए गए हैं। कुछ आधुनिक अनुसंधान भाषाएँ साइड इफेक्ट की उपस्थिति को स्पष्ट करने के लिए प्रभाव प्रणालियों का उपयोग करती हैं।

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

डेटा की अपरिवर्तनीयता कई मामलों में संकलक को एक अनिवार्य भाषा में असुरक्षित धारणा बनाने की स्वीकृति देकर निष्पादन दक्षता की ओर ले जा सकती है, इस प्रकार इनलाइन विस्तार के अवसर बढ़ जाते हैं। आलसी मूल्यांकन भी फ़ंक्शन को तेज कर सकता है, यहां तक ​​​​कि असम्बद्ध रूप से, जबकि यह एक स्थिर कारक द्वारा अधिकतम धीमा कर सकता है (हालांकि, यह अनुचित तरीके से उपयोग किए जाने पर स्मृति रिसाव पेश कर सकता है)। लॉन्चबरी 1993 आलसी मूल्यांकन से मेमोरी लीक से संबंधित सैद्धांतिक मुद्दों पर चर्चा करता है, और ओ'सुलीवन एट अल। 2008 उनका विश्लेषण करने और उन्हें ठीक करने के लिए कुछ व्यावहारिक सलाह दें। हालांकि, आलसी मूल्यांकन का सबसे सामान्य कार्यान्वयन डीरेफरेंस कोड और डेटा का व्यापक उपयोग करता है जो आधुनिक प्रोसेसर पर गहरी पाइपलाइनों और बहु-स्तरीय कैश के साथ खराब प्रदर्शन करता है (जहां एक कैश मिस सैकड़ों चक्र खर्च कर सकता है).

गैर-कार्यात्मक भाषाओं में कार्यात्मक प्रोग्रामिंग
उन भाषाओं में प्रोग्रामिंग की कार्यात्मक शैली का उपयोग करना संभव है जिन्हें पारंपरिक रूप से कार्यात्मक भाषा नहीं माना जाता है। उदाहरण के लिए, दोनों डी (प्रोग्रामिंग भाषा) और फोरट्रान 95 स्पष्ट रूप से शुद्ध कार्यों का समर्थन करते हैं।

जावास्क्रिप्ट, लुआ (प्रोग्रामिंग भाषा), पायथन (प्रोग्रामिंग भाषा) और गो (प्रोग्रामिंग भाषा) उनकी स्थापना के समय से प्रथम श्रेणी का कार्य था। पायथन को 1994 में अनाम फ़ंक्शन, मानचित्र (उच्च-क्रम फ़ंक्शन), फोल्ड (उच्च-क्रम फ़ंक्शन), और फ़िल्टर (उच्च-क्रम फ़ंक्शन) के साथ-साथ पायथन 2.2 में बंद करने के लिए समर्थन मिला था। हालांकि Python 3 ने कम को फिर से हटा दिया  मानक पुस्तकालय मॉड्यूल। PHP 5.3, Visual Basic 9, C Sharp (प्रोग्रामिंग भाषा)|C# 3.0, C++11, और कोटलिन (प्रोग्रामिंग भाषा) जैसी अन्य मुख्यधारा की भाषाओं में प्रथम श्रेणी के कार्यों को पेश किया गया है। PHP में, अनाम कक्षाएं, क्लोजर (कंप्यूटर विज्ञान) और लैम्ब्डा पूरी तरह से समर्थित हैं। कार्यात्मक शैली में प्रोग्रामिंग की सहायता के लिए अपरिवर्तनीय डेटा संरचनाओं के लिए पुस्तकालय और भाषा विस्तार विकसित किए जा रहे हैं।

जावा (प्रोग्रामिंग लैंग्वेज) में, क्लोजर (कंप्यूटर साइंस) का अनुकरण करने के लिए कभी-कभी अनाम कक्षाओं का उपयोग किया जा सकता है; हालांकि, अज्ञात वर्ग हमेशा क्लोजर (कंप्यूटर विज्ञान) के लिए उचित प्रतिस्थापन नहीं होते हैं क्योंकि उनके पास अधिक सीमित क्षमताएं होती हैं। जावा 8 कुछ अज्ञात वर्गों के प्रतिस्थापन के रूप में लैम्ब्डा एक्सप्रेशन का समर्थन करता है। C Sharp (प्रोग्रामिंग लैंग्वेज)|C# में, अनाम क्लास आवश्यक नहीं हैं, क्योंकि क्लोजर (कंप्यूटर साइंस) और लैम्ब्डा पूरी तरह से समर्थित हैं। सी # में कार्यात्मक शैली में प्रोग्रामिंग की सहायता के लिए अपरिवर्तनीय डेटा संरचनाओं के लिए पुस्तकालय और भाषा एक्सटेंशन विकसित किए जा रहे हैं।

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

इसी तरह, कार्यात्मक प्रोग्रामिंग से अपरिवर्तनीय डेटा का विचार प्रायः अनिवार्य प्रोग्रामिंग भाषाओं में सम्मिलित होता है, उदाहरण के लिए पायथन में टपल, जो एक अपरिवर्तनीय सरणी है, और JavaScript में Object.freeze है।

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

शिक्षा
प्रोग्रामिंग भाषा सिद्धांत के क्षेत्र में कार्यात्मक प्रोग्रामिंग अनुसंधान का एक सक्रिय क्षेत्र है। कार्यात्मक प्रोग्रामिंग पर ध्यान केंद्रित करने वाले कई सहकर्मी-समीक्षित प्रकाशन स्थल हैं, जिनमें कार्यात्मक प्रोग्रामिंग पर अंतर्राष्ट्रीय सम्मेलन, कार्यात्मक प्रोग्रामिंग जर्नल और कार्यात्मक प्रोग्रामिंग में प्रवृत्तियों पर संगोष्ठी सम्मिलित है।

उद्योग
कार्यात्मक प्रोग्रामिंग को औद्योगिक अनुप्रयोगों की एक विस्तृत श्रृंखला में नियोजित किया गया है। उदाहरण के लिए, Erlang (प्रोग्रामिंग लैंग्वेज), जिसे 1980 के दशक के अंत में स्वीडन की कंपनी एरिक्सन द्वारा विकसित किया गया था, मूल रूप से दोष सहिष्णुता को प्रयुक्त करने के लिए इस्तेमाल किया गया था। दोष-सहिष्णु दूरसंचार प्रणाली, लेकिन तब से नॉर्टेल, फेसबुक, इलेक्ट्रिसिट डी फ्रांस और व्हाट्सप्प जैसी कंपनियों में कई प्रकार के अनुप्रयोगों के निर्माण के लिए लोकप्रिय हो गया है। स्कीम (प्रोग्रामिंग लैंग्वेज), लिस्प (प्रोग्रामिंग लैंग्वेज) की एक बोली, का उपयोग प्रारम्भिक Apple Macintosh कंप्यूटरों पर कई अनुप्रयोगों के लिए आधार के रूप में किया गया था।  और प्रशिक्षण-कंप्यूटर सिमुलेशन जैसी समस्याओं पर प्रयुक्त किया गया है और दूरबीन नियंत्रण। OCaml, जिसे 1990 के दशक के मध्य में पेश किया गया था, ने वित्तीय विश्लेषण, सॉफ्टवेयर चालक सत्यापन, औद्योगिक रोबोट प्रोग्रामिंग और उपकरणों के नियंत्रण के लिए सॉफ्टवेयर का स्थिर विश्लेषण। हास्केल (प्रोग्रामिंग लैंग्वेज), हालांकि शुरू में एक शोध भाषा के रूप में अभिप्रेत थी, एयरोस्पेस सिस्टम, हार्डवेयर डिजाइन और वेब प्रोग्रामिंग जैसे क्षेत्रों में भी प्रयुक्त किया गया है।

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

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

यह भी देखें

 * विशुद्ध रूप से कार्यात्मक प्रोग्रामिंग
 * प्रोग्रामिंग प्रतिमानों की तुलना
 * उत्सुक मूल्यांकन
 * कार्यात्मक प्रोग्रामिंग विषयों की सूची
 * नेस्टेड फ़ंक्शन
 * आगमनात्मक कार्यात्मक प्रोग्रामिंग
 * कार्यात्मक प्रतिक्रियाशील प्रोग्रामिंग

अग्रिम पठन

 * 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.
 * Dominus, Mark Jason. Higher-Order Perl. Morgan Kaufmann. 2005.
 * Graham, Paul. ANSI Common LISP. Englewood Cliffs, New Jersey: Prentice Hall, 1996.
 * MacLennan, Bruce J. Functional Programming: Practice and Theory. Addison-Wesley, 1990.
 * 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.
 * 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.
 * 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.

बाहरी संबंध

 * An introduction
 * Functional programming in Python (by David Mertz): part 1, part 2, part 3
 * Functional programming in Python (by David Mertz): part 1, part 2, part 3