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

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

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

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

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

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

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

एपीएल
Or in a tacit manner:

=सी++===

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

Or, with generic lambdas provided by C++14:

}

C#
Using just delegates:

Or equivalently, with static methods:

आम लिस्प
=डी===

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

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

एरलांग
इस Erlang उदाहरण में, उच्च-क्रम फ़ंक्शन or_else/2 कार्यों की एक सूची लेता है (Fs) और तर्क (X). यह फ़ंक्शन का मूल्यांकन करता है F तर्क के साथ X तर्क के रूप में। यदि समारोह F झूठा लौटाता है फिर अगला कार्य करता है 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)।

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

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

यह भी देखें

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