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

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

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

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

कार्यात्मक प्रोग्रामिंग की जड़ें अकादमिया में हैं, जो लैम्ब्डा कैलकुलस से विकसित होती है, जो केवल कार्यों पर आधारित संगणना की एक औपचारिक प्रणाली है। योजना (प्रोग्रामिंग भाषा) तुलना में कार्यात्मक प्रोग्रामिंग ऐतिहासिक रूप से कम लोकप्रिय रही है, लेकिन आज उद्योग और शिक्षा में कई कार्यात्मक भाषाओं का उपयोग देखा जा रहा है, जिसमें सामान्य लिस्प, स्कीम (प्रोग्रामिंग भाषा),   क्लोजर, वोल्फ्राम भाषा, रैकेट (प्रोग्रामिंग भाषा), एरलांग (प्रोग्रामिंग भाषा),  अमृत ​​​​(प्रोग्रामिंग भाषा), वस्तुनिष्ठ श्रेणीबद्ध अमूर्त मशीन भाषा,  हास्केल (प्रोग्रामिंग भाषा), और एफ शार्प (प्रोग्रामिंग भाषा) | एफ #।  कार्यात्मक प्रोग्रामिंग भी कुछ भाषाओं के लिए महत्वपूर्ण है, जिन्हें विशिष्ट डोमेन में सफलता मिली है, जैसे वेब में जावास्क्रिप्ट, आँकड़ों में आर (प्रोग्रामिंग भाषा),  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 के दशक में एडिनबर्ग में भी, बर्स्टॉल और डार्लिंगटन ने कार्यात्मक भाषा एनपीएल (प्रोग्रामिंग भाषा) विकसित की। एनपीएल क्लेन के पुनरावर्तन प्रमेय पर आधारित था और पहली बार फ़ंक्शन परिवर्तन पर उनके काम में प्रस्तुत किया गया था। बर्स्टल, मैकक्वीन और सन्नेला ने फिर भाषा होप (प्रोग्रामिंग भाषा) का उत्पादन करने के लिए मेटा भाषा से बहुरूपी प्रकार की जाँच को सम्मिलित किया। मेटा भाषा अंततः कई बोलियों में विकसित हुआ, जिनमें से सबसे आम अब वस्तुनिष्ठ श्रेणीबद्ध अमूर्त मशीन भाषा और 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 को स्पष्ट रूप से परिवर्तित नहीं है और इस प्रकार इइसका कोई दुष्प्रभाव नहीं है। कार्यात्मक कार्यक्रम विशेष रूप से इस प्रकार के फ़ंक्शन का उपयोग करते हैं और इसलिए संदर्भित रूप से पारदर्शी होते हैं।

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

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

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

अनिवार्य बनाम कार्यात्मक प्रोग्रामिंग
निम्नलिखित दो उदाहरण (जावास्क्रिप्ट (प्रोग्रामिंग भाषा) में लिखे गए) समान प्रभाव प्राप्त करते हैं: वे एक सरणी में सभी सम संख्याओं को 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] % 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);

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

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

कार्यात्मक भाषाएँ भी अपरिवर्तनीय अवस्थाओं को अस्थायी करके स्थितियों का अनुकरण करती हैं। यह एक फ़ंक्शन बनाकर किया जा सकता है जो स्थिति को इसके मापदंडों में से एक के रूप में स्वीकार करता है, और परिणाम के साथ एक नया स्थिति वापस करता है, पुराने स्थिति को अपरिवर्तित छोड़ देता है।

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

उद्योग में उपयोग की जाने वाली अन्य कार्यात्मक प्रोग्रामिंग भाषाओं में स्काला (प्रोग्रामिंग भाषा), F# (प्रोग्रामिंग भाषा), वोल्फ्राम भाषा, लिस्प (प्रोग्रामिंग भाषा), मानक मेटा भाषा  और क्लोजर सम्मिलित है।

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

शिक्षा
कई विश्वविद्यालय कार्यात्मक प्रोग्रामिंग सिखाते हैं।   कुछ इसे एक परिचयात्मक प्रोग्रामिंग अवधारणा के रूप में मानते हैं जबकि अन्य पहले अनिवार्य प्रोग्रामिंग विधियों को सिखाते हैं।

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

यह भी देखें

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

अग्रिम पठन

 * 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