उच्च-क्रम फलन

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

अनटाइप्ड लैम्ब्डा कैलकुलस में, सभी फंक्शन उच्च-क्रम वाले होते हैं; एक टाइप किए गए लैम्ब्डा कैलकुस में, जिसमें से अधिकांश कार्यात्मक प्रोग्रामिंग भाषाएं व्युत्पन्न होती हैं, उच्च-क्रम के फलन जो एक फलन को तर्क के रूप में लेते हैं, फॉर्म के प्रकारों के साथ मान्य होते हैं $$(\tau_1\to\tau_2)\to\tau_3$$.

सामान्य उदाहरण

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

प्रत्यक्ष समर्थन
उदाहरणों का उद्देश्य प्रोग्रामिंग भाषाओं की तुलना और तुलना करना नहीं है, बल्कि उच्च-क्रम फलन सिंटैक्स के उदाहरण के रूप में काम करना है

निम्नलिखित उदाहरणों में, उच्च-क्रम फलन twice एक फलन लेता है, और फलन को दो बार कुछ मान पर लागू करता है। अगर twice इसके लिए कई बार आवेदन करना पड़ता है f यह अधिमानतः एक मूल्य के बजाय एक फलन वापस करना चाहिए। यह स्वयं को न दोहराने के सिद्धांत के अनुरूप है।

एपीएल
या उपलक्षित तरीके से:

=सी++===

का उपयोग करते हुए std::function सी ++ 11 में:

या, सी ++ 14 द्वारा प्रदान किए गए सामान्य लैम्ब्डा के साथ:

}

C#
केवल प्रतिनिधियों का उपयोग करना:

या समतुल्य, स्थिर विधियों के साथ:

आम लिस्प
=डी=

एलिक्सिर
एलिक्सिर ​​​​में, आप मॉड्यूल परिभाषाओं और अनाम कार्यों को मिला सकते हैं

वैकल्पिक रूप से, हम शुद्ध अनाम कार्यों का उपयोग करके रचना भी कर सकते हैं।

एरलांग
इस Erlang उदाहरण में, उच्च-क्रम फलन or_else/2 कार्यों की एक सूची लेता है (Fs) और तर्क (X). यह फलन का मूल्यांकन करता है F तर्क के साथ X तर्क के रूप में। यदि फलन F false लौटाता है फिर अगला कार्य करता है Fs मूल्यांकन किया जाएगा। यदि फलन F रिटर्न {false, Y} फिर अगला फलन में Fs तर्क के साथ Y मूल्यांकन किया जाएगा। यदि फलन F रिटर्न R उच्च-क्रम फलन or_else/2 वापसी करेंगे R. ध्यान दें कि X, Y, और R कार्य हो सकते हैं। उदाहरण लौटता है false.

गो
ध्यान दें कि एक फलन शाब्दिक या तो पहचानकर्ता के साथ परिभाषित किया जा सकता है (twice) या गुमनाम रूप से (वैरिएबल को असाइन किया गया plusThree).

जे
स्पष्ट रूप से,

जावा (1.8+)
केवल कार्यात्मक इंटरफेस का उपयोग करना:

या समतुल्य, स्थिर विधियों के साथ:

जावास्क्रिप्ट
तीर कार्यों के साथ:

या शास्त्रीय वाक्य रचना के साथ:

ओकैमल
= पीएचपी ===

या चर में सभी कार्यों के साथ:

ध्यान दें कि एरो फ़ंक्शंस मूल रूप से पैरेंट स्कोप से आने वाले किसी भी वेरिएबल को कैप्चर करता है, जबकि अनाम कार्यों की आवश्यकता होती है use ऐसा करने के लिए कीवर्ड।

पर्ल
या चर में सभी कार्यों के साथ:

पायथन
पायथन डेकोरेटर सिंटैक्स का उपयोग अक्सर किसी फलन को उच्च-क्रम फलन के माध्यम से उस फलन को पारित करने के परिणाम के साथ बदलने के लिए किया जाता है। उदा., फलन g समान रूप से लागू किया जा सकता है:

राकु
राकू में, सभी कोड ऑब्जेक्ट क्लोजर हैं और इसलिए आंतरिक लेक्सिकल वैरिएबल को बाहरी दायरे से संदर्भित कर सकते हैं क्योंकि लेक्सिकल वैरिएबल फलन के अंदर बंद है। Raku लैम्ब्डा एक्सप्रेशंस के लिए नुकीले ब्लॉक सिंटैक्स का भी समर्थन करता है जिसे एक चर के लिए असाइन किया जा सकता है या गुमनाम रूप से लागू किया जा सकता है।

योजना
इस योजना उदाहरण में, उच्च-क्रम फलन (f x) करी को लागू करने के लिए प्रयोग किया जाता है। यह एक तर्क लेता है और एक फलन देता है। अभिव्यक्ति का मूल्यांकन ((f 3) 7) पहले मूल्यांकन के बाद एक फलन लौटाता है (f 3). लौटाया गया कार्य है (lambda (y) (+ 3 y)). फिर, यह तर्क के रूप में 7 के साथ दिए गए फलन का मूल्यांकन करता है, 10 लौटाता है। यह अभिव्यक्ति के बराबर है (add 3 7), तब से (f x) के करी रूप के बराबर है (add x y).

टीसीएल
अनाम फलन (8.6 के बाद से) को लागू करने के लिए टीसीएल लागू कमांड का उपयोग करता है।

XACML
XACML मानक विशेषता बैग के एकाधिक मानों पर फलन लागू करने के लिए मानक में उच्च-क्रम फलन को परिभाषित करता है।

XACML में उच्च-क्रम के कार्यों की सूची XACML# उच्च क्रम के कार्यों को मिल सकती है।

फंक्शन पॉइंटर
C (प्रोग्रामिंग लैंग्वेज), C++, और पास्कल (प्रोग्रामिंग भाषा) जैसी भाषाओं में फंक्शन पॉइंटर्स प्रोग्रामर्स को फंक्शन्स के संदर्भ में पास करने की अनुमति देते हैं। निम्नलिखित सी कोड एक मनमानी फलन के अभिन्न अंग के अनुमान की गणना करता है:

सी मानक लाइब्रेरी से qsort फलन उच्च-क्रम फलन के व्यवहार का अनुकरण करने के लिए फलन पॉइंटर का उपयोग करता है।

मैक्रोज़
उच्च-क्रम के कार्यों के कुछ प्रभावों को प्राप्त करने के लिए मैक्रो (कंप्यूटर विज्ञान) का भी उपयोग किया जा सकता है। हालाँकि, मैक्रोज़ आसानी से वेरिएबल कैप्चर की समस्या से नहीं बच सकते हैं; उनके परिणामस्वरूप बड़ी मात्रा में डुप्लिकेट कोड भी हो सकता है, जो कि एक कंपाइलर के लिए अनुकूलित करना अधिक कठिन हो सकता है। मैक्रोज़ सामान्यतः दृढ़ता से टाइप नहीं किए जाते हैं, हालांकि वे दृढ़ता से टाइप किए गए कोड का उत्पादन कर सकते हैं।

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

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

फ़्री पास्कल में एक फंक्शन के साथ एक साधारण स्टैक आधारित रिकॉर्ड का उपयोग करने का एक उदाहरण जो एक फंक्शन लौटाता है:

कार्यक्रम  लिया जाता है एक   रिकॉर्ड इनपुट के रूप में और रिकॉर्ड के योग का पूर्णांक मान लौटाता है   और   फ़ील्ड्स (3 + 7)।

निष्क्रियता
डिफंक्शनलाइजेशन का उपयोग उन भाषाओं में उच्च-क्रम के कार्यों को लागू करने के लिए किया जा सकता है जिनमें प्रथम श्रेणी के कार्यों की कमी होती है | प्रथम श्रेणी के कार्य:

इस मामले में, फलन अधिभार के माध्यम से विभिन्न कार्यों को ट्रिगर करने के लिए विभिन्न प्रकारों का उपयोग किया जाता है। इस उदाहरण में अतिभारित कार्य में हस्ताक्षर हैं.

यह भी देखें

 * प्रथम श्रेणी फलन
 * संयुक्त तर्क
 * फंक्शन-लेवल प्रोग्रामिंग
 * कार्यात्मक प्रोग्रामिंग
 * कप्पा कलन - कार्यों के लिए एक औपचारिकता जो उच्च-क्रम के कार्यों को बाहर करती है
 * रणनीति पैटर्न
 * उच्च आदेश संदेश