उच्च-क्रम फलन: Difference between revisions

From Vigyanwiki
No edit summary
 
(5 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{Short description|Function that takes one or more functions as an input or that outputs a function}}
{{Short description|Function that takes one or more functions as an input or that outputs a function}}गणित और [[कंप्यूटर विज्ञान]] में, '''उच्च-क्रम फलन''' (HOF) एक फलन (गणित) है जो निम्न में से कम से कम एक कार्य को परिभाषित करता है:
{{Distinguish|फ़ंक्टर{{!}}फ़ंक्टर (श्रेणी सिद्धांत)}}
* तर्क के रूप में एक या एक से अधिक कार्य करता है (अर्थात एक [[प्रक्रियात्मक पैरामीटर]], जो एक उप नाम का एक [[पैरामीटर (कंप्यूटर विज्ञान)]] है जो स्वयं एक प्रक्रिया है),
* यह परिणाम के रूप में एक फलन देता है।
अन्य सभी कार्य ''प्रथम क्रम के कार्य'' हैं। गणित में उच्च-क्रम के कार्यों को ''संचालक (गणित)'' या ''[[कार्यात्मक (गणित)]]'' भी कहा जाता है। [[गणना]] में [[अंतर ऑपरेटर]] एक सामान्य उदाहरण है, क्योंकि यह एक फलन को इसके व्युत्पन्न के लिए रेखित करता है, यह एक फलन भी है। पूरे गणित में फ़ंक्टर शब्द के अन्य उपयोगों के साथ उच्च-क्रम के कार्यों को भ्रमित नहीं किया जाना चाहिए, [[फ़ंक्टर]] (बहुविकल्पी) देखें।


गणित और [[कंप्यूटर विज्ञान]] में, एक उच्च-क्रम फ़ंक्शन (HOF) एक फ़ंक्शन (गणित) है जो निम्न में से कम से कम एक कार्य करता है:
अनटाइप्ड [[लैम्ब्डा कैलकुलस]] में, सभी फंक्शन उच्च-क्रम वाले होते हैं; एक टाइप किए गए लैम्ब्डा कैलकुस में, जिसमें से अधिकांश [[कार्यात्मक प्रोग्रामिंग]] भाषाएं व्युत्पन्न होती हैं, उच्च-क्रम के फलन जो एक फलन को तर्क के रूप में लेते हैं, फॉर्म के प्रकारों के साथ मान्य होते हैं <math>(\tau_1\to\tau_2)\to\tau_3</math>.
* तर्क के रूप में एक या एक से अधिक कार्य करता है (यानी एक [[प्रक्रियात्मक पैरामीटर]], जो एक उपनेमका का एक [[पैरामीटर (कंप्यूटर विज्ञान)]] है जो स्वयं एक प्रक्रिया है),
* इसके परिणाम के रूप में एक समारोह देता है।
अन्य सभी कार्य ''प्रथम क्रम के कार्य'' हैं। गणित में उच्च-क्रम के कार्यों को ''संचालक (गणित)'' या ''[[कार्यात्मक (गणित)]]'' भी कहा जाता है। [[गणना]] में [[अंतर ऑपरेटर]] एक सामान्य उदाहरण है, क्योंकि यह एक फ़ंक्शन को इसके व्युत्पन्न के लिए मैप करता है, यह एक फ़ंक्शन भी है। पूरे गणित में फ़ंक्टर शब्द के अन्य उपयोगों के साथ उच्च-क्रम के कार्यों को भ्रमित नहीं किया जाना चाहिए, फ़ंक्टर (बहुविकल्पी) देखें।
 
अनटाइप्ड [[लैम्ब्डा कैलकुलस]] में, सभी फंक्शन उच्च-क्रम वाले होते हैं; एक टाइप किए गए लैम्ब्डा कैलकुस में, जिसमें से अधिकांश [[कार्यात्मक प्रोग्रामिंग]] भाषाएं व्युत्पन्न होती हैं, उच्च-क्रम के फ़ंक्शन जो एक फ़ंक्शन को तर्क के रूप में लेते हैं, फॉर्म के प्रकारों के साथ मान होते हैं <math>(\tau_1\to\tau_2)\to\tau_3</math>.


== सामान्य उदाहरण ==
== सामान्य उदाहरण ==
* <code>[[map (higher-order function)|map]]</code> फ़ंक्शन, कई कार्यात्मक प्रोग्रामिंग भाषाओं में पाया जाता है, उच्च-क्रम फ़ंक्शन का एक उदाहरण है। यह तर्क के रूप में एक फ़ंक्शन f और तत्वों का एक संग्रह लेता है, और परिणामस्वरूप, संग्रह से प्रत्येक तत्व पर लागू f के साथ एक नया संग्रह देता है।
* <code>[[map (higher-order function)|map]]</code> फलन, कई कार्यात्मक प्रोग्रामिंग भाषाओं में पाया जाता है, उच्च-क्रम फलन का एक उदाहरण है। यह तर्क के रूप में एक फलन f और तत्वों का एक संग्रह लेता है, और परिणामस्वरूप, संग्रह से प्रत्येक तत्व पर लागू f के साथ एक नया संग्रह देता है।
* सॉर्टिंग फ़ंक्शंस, जो एक तुलना फ़ंक्शन को एक पैरामीटर के रूप में लेते हैं, प्रोग्रामर को सॉर्टिंग एल्गोरिथ्म को सॉर्ट किए जा रहे आइटमों की तुलना से अलग करने की अनुमति देता है। [[सी (प्रोग्रामिंग भाषा)]] मानक [[समारोह (कंप्यूटर विज्ञान)]] <code>qsort</code> इसका एक उदाहरण है।
* सॉर्टिंग फ़ंक्शंस, जो एक तुलना फलन को एक पैरामीटर के रूप में लेते हैं, प्रोग्रामर को सॉर्टिंग एल्गोरिथ्म को सॉर्ट किए जा रहे आइटमों की तुलना से अलग करने की अनुमति देता है। [[सी (प्रोग्रामिंग भाषा)]] मानक [[समारोह (कंप्यूटर विज्ञान)|फलन (कंप्यूटर विज्ञान)]] <code>qsort</code> इसका एक उदाहरण है।
* फ़िल्टर (उच्च-क्रम फ़ंक्शन)
* फ़िल्टर (उच्च-क्रम फलन)
* गुना (उच्च-क्रम समारोह)
* गुना (उच्च-क्रम फलन)
* [[आवेदन करना]]
* [[आवेदन करना]]
* फंक्शन रचना (कंप्यूटर विज्ञान)
* फंक्शन रचना (कंप्यूटर विज्ञान)
Line 25: Line 22:


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


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


==== एपीएल ====
==== एपीएल ====
Line 42: Line 39:
</syntaxhighlight>
</syntaxhighlight>


Or in a tacit manner:
या उपलक्षित तरीके से:


<syntaxhighlight lang="apl">
<syntaxhighlight lang="apl">
Line 55: Line 52:
</syntaxhighlight>
</syntaxhighlight>


[[Category:Articles with hatnote templates targeting a nonexistent page]]
 
[[Category:Created On 03/02/2023]]
 
[[Category:Machine Translated Page]]
 
[[Category:Pages with script errors]]
 
[[Category:Short description with empty Wikidata description]]
 
[[Category:Template documentation pages|Short description/doc]]
 
[[Category:Templates Vigyan Ready]]
 
[[Category:Templates that add a tracking category]]
 
[[Category:Templates that generate short descriptions]]
 
[[Category:Templates using TemplateData]]
 


=सी++===
=सी++===
Line 93: Line 90:
</syntaxhighlight>
</syntaxhighlight>


Or, with generic lambdas provided by C++14:
या, सी ++ 14 द्वारा प्रदान किए गए सामान्य लैम्ब्डा के साथ:


<syntaxhighlight lang="c++">
<syntaxhighlight lang="c++">
Line 121: Line 118:
{{further information|सी शार्प (प्रोग्रामिंग भाषा)}}
{{further information|सी शार्प (प्रोग्रामिंग भाषा)}}


Using just delegates:
केवल प्रतिनिधियों का उपयोग करना:


<syntaxhighlight lang="csharp">
<syntaxhighlight lang="csharp">
Line 141: Line 138:
</syntaxhighlight>
</syntaxhighlight>


Or equivalently, with static methods:
या समतुल्य, स्थिर विधियों के साथ:


<syntaxhighlight lang="csharp">
<syntaxhighlight lang="csharp">
Line 180: Line 177:
</syntaxhighlight>
</syntaxhighlight>


[[Category:Articles with hatnote templates targeting a nonexistent page]]
 
[[Category:Created On 03/02/2023]]
 
[[Category:Machine Translated Page]]
 
[[Category:Pages with script errors]]
 
[[Category:Short description with empty Wikidata description]]
 
[[Category:Template documentation pages|Short description/doc]]
 
[[Category:Templates Vigyan Ready]]
 
[[Category:Templates that add a tracking category]]
 
[[Category:Templates that generate short descriptions]]
 
[[Category:Templates using TemplateData]]
 


==== कोल्ड फ्यूजन मार्कअप लैंग्वेज (CFML) ====
==== कोल्ड फ्यूजन मार्कअप लैंग्वेज (CFML) ====
Line 209: Line 206:
</syntaxhighlight>
</syntaxhighlight>


[[Category:Articles with hatnote templates targeting a nonexistent page]]
 
[[Category:Created On 03/02/2023]]
 
[[Category:Machine Translated Page]]
 
[[Category:Pages with script errors]]
 
[[Category:Short description with empty Wikidata description]]
 
[[Category:Template documentation pages|Short description/doc]]
 
[[Category:Templates Vigyan Ready]]
 
[[Category:Templates that add a tracking category]]
 
[[Category:Templates that generate short descriptions]]
 
[[Category:Templates using TemplateData]]
 


==== आम लिस्प ====
==== आम लिस्प ====
Line 234: Line 231:
</syntaxhighlight>
</syntaxhighlight>


[[Category:Articles with hatnote templates targeting a nonexistent page]]
[[Category:Created On 03/02/2023]]
[[Category:Machine Translated Page]]
[[Category:Pages with script errors]]
[[Category:Short description with empty Wikidata description]]
[[Category:Template documentation pages|Short description/doc]]
[[Category:Templates Vigyan Ready]]
[[Category:Templates that add a tracking category]]
[[Category:Templates that generate short descriptions]]
[[Category:Templates using TemplateData]]


=डी===
 
 
 
 
 
 
 
 
 
 
=डी=
{{further information|डी (प्रोग्रामिंग भाषा)}}
{{further information|डी (प्रोग्रामिंग भाषा)}}
<वाक्यविन्यास प्रकाश लैंग = डी>
<syntaxhighlight lang="d">
आयात std.stdio : writeln;
import std.stdio : writeln;


उपनाम दो बार = (एफ) => (इंट एक्स) => एफ (एफ (एक्स));
alias twice = (f) => (int x) => f(f(x));


उर्फ प्लसथ्री = (इंट आई) => आई + 3;
alias plusThree = (int i) => i + 3;


शून्य मुख्य ()
void main()
{
{
     ऑटो जी = दो बार (प्लसथ्री);
     auto g = twice(plusThree);


     लेख (जी (7)); // 13
     writeln(g(7)); // 13
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


====डार्ट====
====डार्ट====
{{further information|डार्ट (प्रोग्रामिंग भाषा)}}
{{further information|डार्ट (प्रोग्रामिंग भाषा)}}
<वाक्यविन्यास लैंग = डार्ट>
<syntaxhighlight lang="dart">
इंट फंक्शन (इंट) दो बार (इंट फंक्शन (इंट) एफ) {
int Function(int) twice(int Function(int) f) {
     वापसी (एक्स) {
     return (x) {
         वापसी एफ (एफ (एक्स));
         return f(f(x));
     };
     };
}
}


इंट प्लस थ्री (इंट आई) {
int plusThree(int i) {
     वापसी मैं + 3;
     return i + 3;
}
}


शून्य मुख्य () {
void main() {
     अंतिम जी = दो बार (प्लसथ्री);
     final g = twice(plusThree);
      
      
     प्रिंट (जी (7)); // 13
     print(g(7)); // 13
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


==== अमृत ====
==== एलिक्सिर ====
{{further information|एलिक्सिर ​​(प्रोग्रामिंग भाषा)}}
{{further information|एलिक्सिर ​​(प्रोग्रामिंग भाषा)}}
अमृत ​​​​में, आप मॉड्यूल परिभाषाओं और अनाम कार्यों को मिला सकते हैं
एलिक्सिर ​​​​में, आप मॉड्यूल परिभाषाओं और अनाम कार्यों को मिला सकते हैं


<वाक्यविन्यास लैंग = अमृत>
<syntaxhighlight lang="elixir">
डिफमॉड्यूल हॉफ डू
defmodule Hof do
     def दो बार (एफ) करते हैं
     def twice(f) do
         fn(x) -> f.(f.(x)) अंत
         fn(x) -> f.(f.(x)) end
     अंत
     end
अंत
end


plus_three = fn (i) -> 3 + i समाप्त
plus_three = fn(i) -> 3 + i end


जी = हॉफ। दो बार (प्लस_थ्री)
g = Hof.twice(plus_three)


IO.puts g.(7) # 13
IO.puts g.(7) # 13
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


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


<वाक्यविन्यास लैंग = अमृत>
<syntaxhighlight lang="elixir">
दो बार = एफएन (एफ) ->
twice = fn(f) ->
     fn(x) -> f.(f.(x)) अंत
     fn(x) -> f.(f.(x)) end
अंत
end


plus_three = fn (i) -> 3 + i समाप्त
plus_three = fn(i) -> 3 + i end


जी = दो बार। (प्लस_थ्री)
g = twice.(plus_three)


IO.puts g.(7) # 13
IO.puts g.(7) # 13
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


==== एरलांग ====
==== एरलांग ====
{{further information|एरलांग (प्रोग्रामिंग भाषा)}}
{{further information|एरलांग (प्रोग्रामिंग भाषा)}}
<वाक्यविन्यास लैंग = erlang>
<syntaxhighlight lang="erlang">
or_else([], _) -> झूठा;
or_else([], _) -> false;
or_else ([एफ | एफएस], एक्स) -> or_else (एफएस, एक्स, एफ (एक्स))
or_else([F | Fs], X) -> or_else(Fs, X, F(X)).


or_else(Fs, X, false) -> or_else(Fs, X);
or_else(Fs, X, false) -> or_else(Fs, X);
or_else(Fs, _, {false, Y}) -> or_else(Fs, Y);
or_else(Fs, _, {false, Y}) -> or_else(Fs, Y);
or_else (_, _, आर) -> आर।
or_else(_, _, R) -> R.


or_else([मजेदार erlang:is_integer/1, fun erlang:is_atom/1, fun erlang:is_list/1], 3.23)
or_else([fun erlang:is_integer/1, fun erlang:is_atom/1, fun erlang:is_list/1], 3.23).
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


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


====एफ#====
====एफ#====
{{further information|एफ शार्प (प्रोग्रामिंग भाषा)}}
{{further information|एफ शार्प (प्रोग्रामिंग भाषा)}}
<वाक्यविन्यास लैंग = fsharp>
<syntaxhighlight lang="fsharp">
माना दो बार f = f >> f
let twice f = f >> f


माना plus_three = (+) 3
let plus_three = (+) 3


चलो जी = दो बार प्लस_थ्री
let g = twice plus_three


जी 7 |> प्रिंटफ% // 13
g 7 |> printf "%A" // 13
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


==== जाओ ====
==== गो ====
{{further information|गो (प्रोग्रामिंग भाषा)}}
{{further information|गो (प्रोग्रामिंग भाषा)}}
<वाक्यविन्यास प्रकाश लैंग = जाओ>
<syntaxhighlight lang="go">
मुख्य पैकेज
package main


एफएमटी आयात करें
import "fmt"


func दो बार (f func (int) int) func (int) int {
func twice(f func(int) int) func(int) int {
रिटर्न फंक (एक्स इंट) इंट {
return func(x int) int {
रिटर्न एफ (एफ (एक्स))
return f(f(x))
}
}
}
}


फंक मेन () {
func main() {
plusThree := func(i int) int {
plusThree := func(i int) int {
वापसी मैं + 3
return i + 3
}
}


जी := दो बार (प्लस तीन)
g := twice(plusThree)


fmt.Println (जी (7)) // 13
fmt.Println(g(7)) // 13
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


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


==== हास्केल ====
==== हास्केल ====
{{further information|हास्केल (प्रोग्रामिंग भाषा)}}
{{further information|हास्केल (प्रोग्रामिंग भाषा)}}
<वाक्यविन्यास लैंग = हैकेल>
<syntaxhighlight lang="haskell">
दो बार :: (इंट -> इंट) -> (इंट -> इंट)
twice :: (Int -> Int) -> (Int -> Int)
दो बार एफ = एफ। एफ
twice f = f . f


plusThree :: इंट -> इंट
plusThree :: Int -> Int
जमा तीन = (+3)
plusThree = (+3)


मुख्य :: आईओ ()
main :: IO ()
मुख्य = प्रिंट (जी 7) - 13
main = print (g 7) -- 13
   कहाँ
   where
     जी = दो बार प्लस थ्री
     g = twice plusThree
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


==== जे ====
==== जे ====
Line 386: Line 383:
स्पष्ट रूप से,
स्पष्ट रूप से,


<वाक्यविन्यास प्रकाश लैंग = जे>
<syntaxhighlight lang="J">
   दो बार =। क्रिया विशेषण: 'यू यू वाई'
   twice=.    adverb : 'u u y'


   प्लसथ्री =। क्रिया : 'वाई + 3'
   plusthree=. verb  : 'y + 3'
    
    
   जी =plusthree दो बार
   g=. plusthree twice
    
    
   जी 7
   g 7
13
13
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


या चुपचाप,


<वाक्यविन्यास प्रकाश लैंग = जे>
  दो बार =। ^:2


   प्लसथ्री =+&3
<syntaxhighlight lang="J">
  twice=. ^:2
 
   plusthree=. +&3
    
    
   जी =plusthree दो बार
   g=. plusthree twice
    
    
   जी 7
   g 7
13
13
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


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


<वाक्यविन्यास प्रकाश लैंग = जावा>
<syntaxhighlight lang="java">
आयात java.util.function.*;
import java.util.function.*;


वर्ग मुख्य {
class Main {
     सार्वजनिक स्थैतिक शून्य main (String [] args) {
     public static void main(String[] args) {
         फंक्शन <IntUnaryOperator, IntUnaryOperator> दो बार = f -> f.andThen (f);
         Function<IntUnaryOperator, IntUnaryOperator> twice = f -> f.andThen(f);


         IntUnaryOperator plusThree = i -> i + 3;
         IntUnaryOperator plusThree = i -> i + 3;


         var g = दो बार। लागू करें (प्लसथ्री);
         var g = twice.apply(plusThree);


         System.out.println(g.applyAsInt(7)); // 13
         System.out.println(g.applyAsInt(7)); // 13
     }
     }
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


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


<वाक्यविन्यास प्रकाश लैंग = जावा>
<syntaxhighlight lang="java">
आयात java.util.function.*;
import java.util.function.*;


वर्ग मुख्य {
class Main {
     निजी स्थिर इंटयूनरीऑपरेटर दो बार (इंटयूनरीऑपरेटर एफ) {
     private static IntUnaryOperator twice(IntUnaryOperator f) {
         वापसी f.andThen (एफ);
         return f.andThen(f);
     }
     }


     निजी स्थिर इंट प्लस थ्री (इंट आई) {
     private static int plusThree(int i) {
         वापसी मैं + 3;
         return i + 3;
     }
     }


     सार्वजनिक स्थैतिक शून्य main (String [] args) {
     public static void main(String[] args) {
         वर जी = दो बार (मुख्य :: plusThree);
         var g = twice(Main::plusThree);


         System.out.println(g.applyAsInt(7)); // 13
         System.out.println(g.applyAsInt(7)); // 13
     }
     }
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


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


<वाक्यविन्यास लैंग = जावास्क्रिप्ट>
<syntaxhighlight lang="javascript">
सख्त प्रयोग करें;
"use strict";


const दो बार = f => x => f(f(x));
const twice = f => x => f(f(x));


const plusThree = i => i + 3;
const plusThree = i => i + 3;


कॉन्स्ट जी = दो बार (प्लसथ्री);
const g = twice(plusThree);


कंसोल.लॉग (जी (7)); // 13
console.log(g(7)); // 13
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


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


<वाक्यविन्यास लैंग = जावास्क्रिप्ट>
<syntaxhighlight lang="javascript">
सख्त प्रयोग करें;
"use strict";


समारोह दो बार () {
function twice(f) {
   वापसी समारोह (एक्स) {
   return function (x) {
     वापसी एफ (एफ (एक्स));
     return f(f(x));
   };
   };
}
}


फ़ंक्शन प्लस थ्री (i) {
function plusThree(i) {
   वापसी मैं + 3;
   return i + 3;
}
}


कॉन्स्ट जी = दो बार (प्लसथ्री);
const g = twice(plusThree);


कंसोल.लॉग (जी (7)); // 13
console.log(g(7)); // 13
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


==== जूलिया ====
==== जूलिया ====
{{further information|जूलिया (प्रोग्रामिंग भाषा)}}
{{further information|जूलिया (प्रोग्रामिंग भाषा)}}
<वाक्यविन्यास लैंग = jlcon>
<syntaxhighlight lang="jlcon">
जूलिया> दो बार कार्य करें ()
julia> function twice(f)
           कार्य परिणाम (एक्स)
           function result(x)
               रिटर्न एफ (एफ (एक्स))
               return f(f(x))
           अंत
           end
           वापसी परिणाम
           return result
       अंत
       end
दो बार (1 विधि के साथ सामान्य कार्य)
twice (generic function with 1 method)


जूलिया> प्लसथ्री (i) = i + 3
julia> plusthree(i) = i + 3
plusthree (1 विधि के साथ सामान्य कार्य)
plusthree (generic function with 1 method)


जूलिया> जी = दो बार (प्लसथ्री)
julia> g = twice(plusthree)
(::var #result#3 {typeof(plusthree)}) (1 विधि के साथ सामान्य कार्य)
(::var"#result#3"{typeof(plusthree)}) (generic function with 1 method)


जूलिया> जी(7)
julia> g(7)
13
13
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


==== कोटलिन ====
==== कोटलिन ====
{{further information|कोटलिन (प्रोग्रामिंग भाषा)}}
{{further information|कोटलिन (प्रोग्रामिंग भाषा)}}
<वाक्यविन्यास लैंग = कोटलिन>
<syntaxhighlight lang="kotlin">
मज़ा दो बार (एफ: (इंट) -> इंट): (इंट) -> इंट {
fun twice(f: (Int) -> Int): (Int) -> Int {
     वापसी {एफ (एफ (यह))}
     return { f(f(it)) }
}
}


फन प्लस थ्री (आई: इंट) = आई + 3
fun plusThree(i: Int) = i + 3


मज़ा मुख्य () {
fun main() {
     वैल जी = दो बार (:: प्लस थ्री)
     val g = twice(::plusThree)


     प्रिंट्लन (जी (7)) // 13
     println(g(7)) // 13
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


==== दो ====
==== दो ====
{{further information|लुआ (प्रोग्रामिंग भाषा)}}
{{further information|लुआ (प्रोग्रामिंग भाषा)}}
<वाक्यविन्यास लैंग = लुआ>
<syntaxhighlight lang="lua">
समारोह दो बार ()
function twice(f)
   वापसी समारोह (एक्स)
   return function (x)
     रिटर्न एफ (एफ (एक्स))
     return f(f(x))
   अंत
   end
अंत
end


फ़ंक्शन प्लस थ्री (i)
function plusThree(i)
   वापसी मैं + 3
   return i + 3
अंत
end


स्थानीय जी = दो बार (प्लसथ्री)
local g = twice(plusThree)


प्रिंट (जी (7)) - 13
print(g(7)) -- 13
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


==== मतलब ====
==== मतलब ====
{{Further information|मैटलैब}}
{{Further information|मैटलैब}}
<वाक्यविन्यास प्रकाश लैंग = matlab>
<syntaxhighlight lang="matlab">
कार्य परिणाम = दो बार ()
function result = twice(f)
     परिणाम = @आंतरिक
     result = @inner


     फ़ंक्शन वैल = आंतरिक (एक्स)
     function val = inner(x)
         वैल = एफ (एफ (एक्स));
         val = f(f(x));
     अंत
     end
अंत
end


plusthree = @(i) i + 3;
plusthree = @(i) i + 3;


जी = दो बार (प्लसथ्री)
g = twice(plusthree)


विवाद (जी (7)); % 13
disp(g(7)); % 13
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


==== ओकैमल ====
==== ओकैमल ====
{{Further information|OCaml (प्रोग्रामिंग भाषा)}}
{{Further information|OCaml (प्रोग्रामिंग भाषा)}}
<वाक्यविन्यास प्रकाश लैंग = ओकैमल प्रारंभ = 1>
<syntaxhighlight lang="ocaml" start="1">
माना दो बार f x =
let twice f x =
   एफ (एफ एक्स)
   f (f x)


मान लीजिए plus_three =
let plus_three =
   (+) 3
   (+) 3


चलो () =
let () =
   चलो जी = दो बार प्लस_थ्री इन
   let g = twice plus_three in
 
  print_int (g 7); (* 13 *)
  print_newline ()
</syntaxhighlight>
 
 
 
 
 
 
 
 
 
 


  Print_int (जी 7); (* 13 *)
  प्रिंट_न्यूलाइन ()
</वाक्यविन्यास हाइलाइट>


= पीएचपी ===
= पीएचपी ===
{{further information|PHP}}
{{further information|PHP}}
<वाक्यविन्यास लैंग = php>
<syntaxhighlight lang="php">
<?php
<?php


घोषित करें (सख्त_प्रकार = 1);
declare(strict_types=1);


फ़ंक्शन दो बार (कॉल करने योग्य $ f): क्लोजर {
function twice(callable $f): Closure {
     रिटर्न फ़ंक्शन (int $x) उपयोग ($f): int {
     return function (int $x) use ($f): int {
         वापसी $f($f($x));
         return $f($f($x));
     };
     };
}
}


फ़ंक्शन प्लस थ्री (इंट $ i): इंट {
function plusThree(int $i): int {
     वापसी $i + 3;
     return $i + 3;
}
}


$ जी = दो बार ('प्लसथ्री');
$g = twice('plusThree');


प्रतिध्वनि $g(7), \n; // 13
echo $g(7), "\n"; // 13
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


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


<वाक्यविन्यास लैंग = php>
<syntaxhighlight lang="php">
<?php
<?php


घोषित करें (सख्त_प्रकार = 1);
declare(strict_types=1);


$ दो बार = एफएन (कॉल करने योग्य $ एफ): क्लोजर => एफएन (इंट $ एक्स): इंट => $ एफ ($ एफ ($ एक्स));
$twice = fn(callable $f): Closure => fn(int $x): int => $f($f($x));


$plusThree = fn(int $i): int => $i + 3;
$plusThree = fn(int $i): int => $i + 3;


$g = $दो बार($plusThree);
$g = $twice($plusThree);


प्रतिध्वनि $g(7), \n; // 13
echo $g(7), "\n"; // 13
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


ध्यान दें कि एरो फ़ंक्शंस मूल रूप से पैरेंट स्कोप से आने वाले किसी भी वेरिएबल को कैप्चर करता है,<ref>{{Cite web|title=PHP: Arrow Functions - Manual|url=https://www.php.net/manual/en/functions.arrow.php|access-date=2021-03-01|website=www.php.net}}</ref> जबकि अनाम कार्यों की आवश्यकता होती है {{code|use}} ऐसा करने के लिए कीवर्ड।
ध्यान दें कि एरो फ़ंक्शंस मूल रूप से पैरेंट स्कोप से आने वाले किसी भी वेरिएबल को कैप्चर करता है,<ref>{{Cite web|title=PHP: Arrow Functions - Manual|url=https://www.php.net/manual/en/functions.arrow.php|access-date=2021-03-01|website=www.php.net}}</ref> जबकि अनाम कार्यों की आवश्यकता होती है {{code|use}} ऐसा करने के लिए कीवर्ड।
Line 619: Line 627:
==== पर्ल ====
==== पर्ल ====
{{further information|पर्ल}}
{{further information|पर्ल}}
<वाक्यविन्यास प्रकाश लैंग = पर्ल>
<syntaxhighlight lang="perl">
सख्त उपयोग;
use strict;
चेतावनियों का उपयोग करें;
use warnings;


उप दो बार {
sub twice {
     मेरा ($ ) = @_;
     my ($f) = @_;
     विषय {
     sub {
         $f->($f->(@_));
         $f->($f->(@_));
     };
     };
}
}


सब प्लस थ्री {
sub plusThree {
     मेरा ($i) = @_;
     my ($i) = @_;
     $ मैं + 3;
     $i + 3;
}
}


मेरा $g = दो बार (\&plusThree);
my $g = twice(\&plusThree);


प्रिंट $g->(7), \n ; # 13
print $g->(7), "\n"; # 13
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


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


<वाक्यविन्यास प्रकाश लैंग = पर्ल>
<syntaxhighlight lang="perl">
सख्त उपयोग;
use strict;
चेतावनियों का उपयोग करें;
use warnings;


मेरा $ दो बार = उप {
my $twice = sub {
     मेरा ($ एफ) = @_;
     my ($f) = @_;
     विषय {
     sub {
         $f->($f->(@_));
         $f->($f->(@_));
     };
     };
};
};


मेरा $ प्लस थ्री = सब {
my $plusThree = sub {
     मेरी ($ एक्स) = @_;
     my ($x) = @_;
     $ एक्स + 3;
     $x + 3;
};
};


my $g = $twice->($plusThree);
my $g = $twice->($plusThree);


प्रिंट $g->(7), \n ; # 13
print $g->(7), "\n"; # 13
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


====पायथन====
====पायथन====
{{further information|पायथन (प्रोग्रामिंग भाषा)}}
{{further information|पायथन (प्रोग्रामिंग भाषा)}}
<वाक्यविन्यास लैंग = पिकॉन>
<syntaxhighlight lang="pycon">
>>> दो बार डीईएफ़ ():
>>> def twice(f):
... डीफ़ परिणाम (एक्स):
...     def result(x):
... रिटर्न एफ (एफ (एक्स))
...         return f(f(x))
... वापसी परिणाम
...     return result


>>> plus_three = लैम्ब्डा i: i + 3
>>> plus_three = lambda i: i + 3


>>> जी = दो बार (प्लस_तीन)
>>> g = twice(plus_three)
      
      
>>> जी(7)
>>> g(7)
13
13
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


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


<वाक्यविन्यास लैंग = पिकॉन>
<syntaxhighlight lang="pycon">
>>> @दो बार
>>> @twice
... डीईएफ़ जी (मैं):
... def g(i):
... वापसी मैं + 3
...     return i + 3


>>> जी(7)
>>> g(7)
13
13
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>
 


====आर ====
====आर ====
{{further information|आर (प्रोग्रामिंग भाषा)}}
{{further information|आर (प्रोग्रामिंग भाषा)}}
<वाक्यविन्यास प्रकाश लैंग = आर>
<syntaxhighlight lang="R">
दो बार <- फ़ंक्शन (एफ) {
twice <- function(f) {
   वापसी (फ़ंक्शन (एक्स) {
   return(function(x) {
     एफ (एफ (एक्स))
     f(f(x))
   })
   })
}
}


plusThree <- फ़ंक्शन (i) {
plusThree <- function(i) {
   वापसी (मैं + 3)
   return(i + 3)
}
}


जी <- दो बार (प्लसथ्री)
g <- twice(plusThree)


> प्रिंट (जी (7))
> print(g(7))
[1] 13
[1] 13
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


==== राकु ====
==== राकु ====
{{further information|राकू (प्रोग्रामिंग भाषा)}}
{{further information|राकू (प्रोग्रामिंग भाषा)}}
<वाक्यविन्यास प्रकाश लैंग = perl6>
<syntaxhighlight lang="perl6">
उप दो बार (कॉल करने योग्य: डी $ एफ) {
sub twice(Callable:D $f) {
     वापसी उप { $f($f($^x)) };
     return sub { $f($f($^x)) };
}
}


सब प्लसथ्री(इंट:डी $i) {
sub plusThree(Int:D $i) {
     वापसी $i + 3;
     return $i + 3;
}
}


मेरा $g = दो बार (&plusThree);
my $g = twice(&plusThree);


कहो $जी(7); # 13
say $g(7); # 13
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


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


==== रुबी ====
==== रुबी ====
{{further information|रूबी (प्रोग्रामिंग भाषा)}}
{{further information|रूबी (प्रोग्रामिंग भाषा)}}
<वाक्यविन्यास लैंग = रूबी>
<syntaxhighlight lang="ruby">
डीईएफ़ दो बार ()
def twice(f)
   ->(x) { f.call(f.call(x)) }
   ->(x) { f.call(f.call(x)) }
अंत
end


plus_three = -> (i) {i + 3}
plus_three = ->(i) { i + 3 }


जी = दो बार (प्लस_थ्री)
g = twice(plus_three)


जी कॉल (7) # 13 डालता है
puts g.call(7) # 13
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


==== जंग ====
==== जंग ====
{{further information|रस्ट (प्रोग्रामिंग भाषा)}}
{{further information|रस्ट (प्रोग्रामिंग भाषा)}}
<वाक्यविन्यास प्रकाश लैंग = जंग>
<syntaxhighlight lang="rust">
fn दो बार (f: impl Fn(i32) -> i32) -> impl Fn(i32) -> i32 {
fn twice(f: impl Fn(i32) -> i32) -> impl Fn(i32) -> i32 {
     चाल |x| एफ (एफ (एक्स))
     move |x| f(f(x))
}
}


fn plus_three (i: i32) -> i32 {
fn plus_three(i: i32) -> i32 {
     मैं + 3
     i + 3
}
}


एफएन मुख्य () {
fn main() {
     चलो जी = दो बार (प्लस_थ्री);
     let g = twice(plus_three);


     Println! ({}, जी (7)) // 13
     println!("{}", g(7)) // 13
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


==== स्काला ====
==== स्काला ====
{{further information|स्काला (प्रोग्रामिंग भाषा)}}
{{further information|स्काला (प्रोग्रामिंग भाषा)}}
<वाक्यविन्यास प्रकाश लैंग = स्कैला>
<syntaxhighlight lang="scala">
वस्तु मुख्य {
object Main {
   def दो बार (एफ: इंट => इंट): इंट => इंट =
   def twice(f: Int => Int): Int => Int =
     f रचना f
     f compose f


   डीईएफ़ प्लस थ्री (आई: इंट): इंट =
   def plusThree(i: Int): Int =
     मैं + 3
     i + 3


   def मुख्य (तर्क: ऐरे [स्ट्रिंग]): यूनिट = {
   def main(args: Array[String]): Unit = {
     वैल जी = दो बार (प्लसथ्री)
     val g = twice(plusThree)


     प्रिंट (जी (7)) // 13
     print(g(7)) // 13
   }
   }
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>
 


==== योजना ====
==== योजना ====
{{further information|स्कीम (प्रोग्रामिंग भाषा)}}
{{further information|स्कीम (प्रोग्रामिंग भाषा)}}
<वाक्यविन्यास लैंग = योजना>
<syntaxhighlight lang="scheme">
(परिभाषित करें (x y जोड़ें) (+ x y))
(define (add x y) (+ x y))
(परिभाषित करें (एफ एक्स)
(define (f x)
   (लैम्ब्डा (y) (+ x y)))
   (lambda (y) (+ x y)))
(प्रदर्शन ((3) 7))
(display ((f 3) 7))
(प्रदर्शन (3 7 जोड़ें))
(display (add 3 7))
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


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


==== तेज ====
==== तेज ====
{{further information|स्विफ्ट (प्रोग्रामिंग भाषा)}}
{{further information|स्विफ्ट (प्रोग्रामिंग भाषा)}}
<वाक्यविन्यास प्रकाश लैंग = तेज>
<syntaxhighlight lang="swift">
func दो बार (_ f: @escaping (Int) -> Int) -> (Int) -> Int {
func twice(_ f: @escaping (Int) -> Int) -> (Int) -> Int {
     वापसी { f(f($0)) }
     return { f(f($0)) }
}
}


चलो plusThree = { $0 + 3 }
let plusThree = { $0 + 3 }


चलो जी = दो बार (प्लस तीन)
let g = twice(plusThree)


प्रिंट (जी (7)) // 13
print(g(7)) // 13
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


==== टीसीएल ====
==== टीसीएल ====
{{further information|Tcl}}
{{further information|Tcl}}
<वाक्यविन्यास लैंग = टीसीएल>
<syntaxhighlight lang="tcl">
दो बार सेट करें {{f x} {apply $f [apply $f $x]}}
set twice {{f x} {apply $f [apply $f $x]}}
प्लस थ्री सेट करें {{i} {return [expr $i + 3]}}
set plusThree {{i} {return [expr $i + 3]}}
# परिणाम: 13
 
पुट [लागू $दो बार $ प्लस तीन 7]
# result: 13
</वाक्यविन्यास हाइलाइट>
puts [apply $twice $plusThree 7]
अनाम फ़ंक्शन (8.6 के बाद से) को लागू करने के लिए टीसीएल लागू कमांड का उपयोग करता है।
</syntaxhighlight>
 
अनाम फलन (8.6 के बाद से) को लागू करने के लिए टीसीएल लागू कमांड का उपयोग करता है।


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


<वाक्यविन्यास लैंग = xquery>
<syntaxhighlight lang="xquery">
नियम अनुमति प्रवेश {
rule allowEntry{
     आज्ञा देना
     permit
     किसी भी स्थिति में (फ़ंक्शन [स्ट्रिंगइक्वल], नागरिकता, अनुमत नागरिकता)
     condition anyOfAny(function[stringEqual], citizenships, allowedCitizenships)
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


XACML में उच्च-क्रम के कार्यों की सूची XACML# उच्च क्रम के कार्यों को मिल सकती है।
XACML में उच्च-क्रम के कार्यों की सूची XACML# उच्च क्रम के कार्यों को मिल सकती है।
Line 828: Line 840:
==== एक्सक्वायरी ====
==== एक्सक्वायरी ====
{{further information|XQuery}}
{{further information|XQuery}}
<वाक्यविन्यास लैंग = xquery>
<syntaxhighlight lang="xquery">
फ़ंक्शन को स्थानीय घोषित करें: दो बार ($ f, $ x) {
declare function local:twice($f, $x) {
   $f($f($x))
   $f($f($x))
};
};


फ़ंक्शन स्थानीय घोषित करें: प्लसथ्री ($ i) {
declare function local:plusthree($i) {
   $ आई + 3
   $i + 3
};
};


स्थानीय: दो बार (स्थानीय: plusthree#1, 7) (: 13 :)
local:twice(local:plusthree#1, 7) (: 13 :)
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


=== विकल्प ===
=== विकल्प ===


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


<वाक्यविन्यास प्रकाश लैंग = सी>
<syntaxhighlight lang="c">
#शामिल <stdio.h>
#include <stdio.h>


डबल स्क्वायर (डबल एक्स)
double square(double x)
{
{
     वापसी एक्स * एक्स;
     return x * x;
}
}


डबल क्यूब (डबल एक्स)
double cube(double x)
{
{
     वापसी एक्स * एक्स * एक्स;
     return x * x * x;
}
}


/* इंटरवल [a,b] के भीतर f() के इंटीग्रल की गणना करें */
/* Compute the integral of f() within the interval [a,b] */
डबल इंटीग्रल (डबल एफ (डबल एक्स), डबल ए, डबल बी, इंट एन)
double integral(double f(double x), double a, double b, int n)
{
{
     int मैं;
     int i;
     दोहरा योग = 0;
     double sum = 0;
     डबल डीटी = (बी - ) / एन;
     double dt = (b - a) / n;
     के लिए (i = 0; i <n; ++i) {
     for (i = 0; i < n; ++i) {
         योग + = एफ (+ (आई + 0.5) * डीटी);
         sum += f(a + (i + 0.5) * dt);
     }
     }
     वापसी राशि * डीटी;
     return sum * dt;
}
}


मुख्य प्रवेश बिंदु()
int main()
{
{
     प्रिंटफ (% जी \ n, अभिन्न (वर्ग, 0, 1, 100));
     printf("%g\n", integral(square, 0, 1, 100));
     प्रिंटफ (% जी \ n, अभिन्न (घन, 0, 1, 100));
     printf("%g\n", integral(cube, 0, 1, 100));
     वापसी 0;
     return 0;
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


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


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


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


==== वस्तुएँ ====
==== वस्तुएँ ====
Line 893: Line 905:
[[फ़्री पास्कल]] में एक फंक्शन के साथ एक साधारण स्टैक आधारित रिकॉर्ड का उपयोग करने का एक उदाहरण जो एक फंक्शन लौटाता है:
[[फ़्री पास्कल]] में एक फंक्शन के साथ एक साधारण स्टैक आधारित रिकॉर्ड का उपयोग करने का एक उदाहरण जो एक फंक्शन लौटाता है:


<वाक्यविन्यास लैंग = पास्कल>
<syntaxhighlight lang="pascal">
कार्यक्रम का उदाहरण;
program example;


प्रकार
type
   इंट = पूर्णांक;
   int = integer;
   Txy = रिकॉर्ड x, y: int; अंत;
   Txy = record x, y: int; end;
   Tf = फ़ंक्शन (xy: Txy): int;
   Tf = function (xy: Txy): int;
      
      
फलन f(xy: Txy): int;
function f(xy: Txy): int;  
शुरू
begin
   परिणाम := xy.y + xy.x;
   Result := xy.y + xy.x;  
अंत;
end;


फ़ंक्शन जी (फंक: टीएफ): टीएफ;
function g(func: Tf): Tf;  
शुरू
begin
   परिणाम := func;
   result := func;  
अंत;
end;


वर
var
   : टीएफ;
   a: Tf;
   xy: Txy = (x: 3; y: 7);
   xy: Txy = (x: 3; y: 7);


शुरू
begin 
   : = जी (@ एफ); // एक फ़ंक्शन को वापस करें
   a := g(@f);     // return a function to "a"
   राइटलन ((एक्सवाई)); // प्रिंट 10
   writeln(a(xy)); // prints 10
अंत।
end.
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


कार्यक्रम <code>a()</code> लिया जाता है एक <code>Txy</code> रिकॉर्ड इनपुट के रूप में और रिकॉर्ड के योग का पूर्णांक मान लौटाता है <code>x</code> और <code>y</code> फ़ील्ड्स (3 + 7)।
कार्यक्रम <code>a()</code> लिया जाता है एक <code>Txy</code> रिकॉर्ड इनपुट के रूप में और रिकॉर्ड के योग का पूर्णांक मान लौटाता है <code>x</code> और <code>y</code> फ़ील्ड्स (3 + 7)।
Line 926: Line 938:
डिफंक्शनलाइजेशन का उपयोग उन भाषाओं में उच्च-क्रम के कार्यों को लागू करने के लिए किया जा सकता है जिनमें प्रथम श्रेणी के कार्यों की कमी होती है | प्रथम श्रेणी के कार्य:
डिफंक्शनलाइजेशन का उपयोग उन भाषाओं में उच्च-क्रम के कार्यों को लागू करने के लिए किया जा सकता है जिनमें प्रथम श्रेणी के कार्यों की कमी होती है | प्रथम श्रेणी के कार्य:


<वाक्यविन्यास लैंग = सीपीपी>
<syntaxhighlight lang="cpp">
// निष्क्रिय फ़ंक्शन डेटा संरचनाएं
// Defunctionalized function data structures
टेम्प्लेट <टाइपनेम टी> स्ट्रक्चर एड {टी वैल्यू; };
template<typename T> struct Add { T value; };
टेम्प्लेट <टाइपनेम टी> स्ट्रक्चर डिवबी {टी वैल्यू; };
template<typename T> struct DivBy { T value; };
टेम्पलेट <टाइपनाम एफ, टाइपनाम जी> संरचना संरचना {एफ एफ; जी जी; };
template<typename F, typename G> struct Composition { F f; G g; };


// डिफंक्शनलाइज्ड फंक्शन एप्लीकेशन इम्प्लीमेंटेशन
// Defunctionalized function application implementations
टेम्पलेट <टाइपनाम एफ, टाइपनाम जी, टाइपनाम एक्स>
template<typename F, typename G, typename X>
स्वतः लागू (रचना <F, G> f, X arg) {
auto apply(Composition<F, G> f, X arg) {
     रिटर्न अप्लाई (f.f, अप्लाई (f.g, arg));
     return apply(f.f, apply(f.g, arg));
}
}


टेम्पलेट <टाइपनाम टी, टाइपनाम एक्स>
template<typename T, typename X>
स्वतः लागू (जोड़ें <टी> एफ, एक्स तर्क) {
auto apply(Add<T> f, X arg) {
     वापसी तर्क + f.value;
     return arg  + f.value;
}
}


टेम्पलेट <टाइपनाम टी, टाइपनाम एक्स>
template<typename T, typename X>
स्वतः लागू (DivBy<T> f, X arg) {
auto apply(DivBy<T> f, X arg) {
     वापसी तर्क / f.value;
     return arg / f.value;
}
}


// हायर-ऑर्डर कंपोज़ फंक्शन
// Higher-order compose function
टेम्पलेट <टाइपनाम एफ, टाइपनाम जी>
template<typename F, typename G>
रचना<F, G> रचना(F f, G g) {
Composition<F, G> compose(F f, G g) {
     वापसी संरचना <एफ, जी> {एफ, जी};
     return Composition<F, G> {f, g};
}
}


int main(int argc, const char* argv[]) {
int main(int argc, const char* argv[]) {
     ऑटो f = लिखें (DivBy<फ्लोट>{2.0f}, जोड़ें<int>{5});
     auto f = compose(DivBy<float>{ 2.0f }, Add<int>{ 5 });
     लागू करें (एफ, 3); // 4.0f
     apply(f, 3); // 4.0f
     लागू करें (एफ, 9); // 7.0 एफ
     apply(f, 9); // 7.0f
     वापसी 0;
     return 0;
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>


इस मामले में, [[समारोह अधिभार]] के माध्यम से विभिन्न कार्यों को ट्रिगर करने के लिए विभिन्न प्रकारों का उपयोग किया जाता है। इस उदाहरण में अतिभारित कार्य में हस्ताक्षर हैं <code>auto apply</code>.
इस मामले में, [[समारोह अधिभार|फलन अधिभार]] के माध्यम से विभिन्न कार्यों को ट्रिगर करने के लिए विभिन्न प्रकारों का उपयोग किया जाता है। इस उदाहरण में अतिभारित कार्य में हस्ताक्षर हैं <code>auto apply</code>.


== यह भी देखें ==
== यह भी देखें ==
* [[प्रथम श्रेणी समारोह]]
* [[प्रथम श्रेणी समारोह|प्रथम श्रेणी फलन]]
* संयुक्त तर्क
* संयुक्त तर्क
* [[फंक्शन-लेवल प्रोग्रामिंग]]
* [[फंक्शन-लेवल प्रोग्रामिंग]]
Line 976: Line 988:
{{Reflist}}
{{Reflist}}


 
[[Category:Articles with hatnote templates targeting a nonexistent page]]
[[Category: कार्यात्मक प्रोग्रामिंग]] [[Category: लैम्ब्डा कैलकुलस]] [[Category: उच्च-क्रम के कार्य | उच्च-क्रम के कार्य ]] [[Category: सबरूटीन्स]] [[Category: लेख उदाहरण के साथ पायथन (प्रोग्रामिंग भाषा) कोड]] [[Category: उदाहरण हास्केल कोड वाले लेख]] [[Category: स्कीम (प्रोग्रामिंग लैंग्वेज) कोड के उदाहरण वाले लेख]] [[Category: उदाहरण जावास्क्रिप्ट कोड वाले लेख]] [[Category: उदाहरण सी कोड वाले लेख]] [[Category: पास्कल कोड उदाहरण के साथ लेख]] [[Category: उदाहरण आर कोड वाले लेख]]
 
 
 
[[Category: Machine Translated Page]]
[[Category:Created On 03/02/2023]]
[[Category:Created On 03/02/2023]]
[[Category:Lua-based templates]]
[[Category:Machine Translated Page]]
[[Category:Pages with script errors]]
[[Category:Short description with empty Wikidata description]]
[[Category:Template documentation pages|Short description/doc]]
[[Category:Templates Vigyan Ready]]
[[Category:Templates that add a tracking category]]
[[Category:Templates that generate short descriptions]]
[[Category:Templates using TemplateData]]

Latest revision as of 18:40, 25 February 2023

गणित और कंप्यूटर विज्ञान में, उच्च-क्रम फलन (HOF) एक फलन (गणित) है जो निम्न में से कम से कम एक कार्य को परिभाषित करता है:

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

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

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

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

प्रोग्रामिंग भाषाओं में समर्थन

प्रत्यक्ष समर्थन

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

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

एपीएल

      twice{⍺⍺ ⍺⍺ }

      plusthree{+3}

      g{plusthree twice }
    
      g 7
13

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

      twice2

      plusthree+3

      gplusthree twice
    
      g 7
13







सी++==

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

#include <iostream>
#include <functional>

auto twice = [](const std::function<int(int)>& f)
{
    return [f](int x) {
        return f(f(x));
    };
};

auto plus_three = [](int i)
{
    return i + 3;
};

int main()
{
    auto g = twice(plus_three);

    std::cout << g(7) << '\n'; // 13
}

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

#include <iostream>

auto twice = [](const auto& f)
{
    return [f](int x) {
        return f(f(x));
    };
};

auto plus_three = [](int i)
{
    return i + 3;
};

int main()
{
    auto g = twice(plus_three);

    std::cout << g(7) << '\n'; // 13
}

}

C#

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

using System;

public class Program
{
    public static void Main(string[] args)
    {
        Func<Func<int, int>, Func<int, int>> twice = f => x => f(f(x));

        Func<int, int> plusThree = i => i + 3;

        var g = twice(plusThree);

        Console.WriteLine(g(7)); // 13
    }
}

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

using System;

public class Program
{
    private static Func<int, int> Twice(Func<int, int> f)
    {
        return x => f(f(x));
    }

    private static int PlusThree(int i) => i + 3;

    public static void Main(string[] args)
    {
        var g = Twice(PlusThree);

        Console.WriteLine(g(7)); // 13
    }
}


क्लोजर

(defn twice [f]
  (fn [x] (f (f x))))

(defn plus-three [i]
  (+ i 3))

(def g (twice plus-three))

(println (g 7)) ; 13







कोल्ड फ्यूजन मार्कअप लैंग्वेज (CFML)

twice = function(f) {
    return function(x) {
        return f(f(x));
    };
};

plusThree = function(i) {
    return i + 3;
};

g = twice(plusThree);

writeOutput(g(7)); // 13







आम लिस्प

(defun twice (f)                                                                
  (lambda (x) (funcall f (funcall f x))))                                       
                                                                                
(defun plus-three (i)                                                           
  (+ i 3))                                                                      
                                                                                
(defvar g (twice #'plus-three))                                                 
                                                                                
(print (funcall g 7))







डी

import std.stdio : writeln;

alias twice = (f) => (int x) => f(f(x));

alias plusThree = (int i) => i + 3;

void main()
{
    auto g = twice(plusThree);

    writeln(g(7)); // 13
}

डार्ट

int Function(int) twice(int Function(int) f) {
    return (x) {
        return f(f(x));
    };
}

int plusThree(int i) {
    return i + 3;
}

void main() {
    final g = twice(plusThree);
    
    print(g(7)); // 13
}

एलिक्सिर

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

defmodule Hof do
    def twice(f) do
        fn(x) -> f.(f.(x)) end
    end
end

plus_three = fn(i) -> 3 + i end

g = Hof.twice(plus_three)

IO.puts g.(7) # 13

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

twice = fn(f) ->
    fn(x) -> f.(f.(x)) end
end

plus_three = fn(i) -> 3 + i end

g = twice.(plus_three)

IO.puts g.(7) # 13

एरलांग

or_else([], _) -> false;
or_else([F | Fs], X) -> or_else(Fs, X, F(X)).

or_else(Fs, X, false) -> or_else(Fs, X);
or_else(Fs, _, {false, Y}) -> or_else(Fs, Y);
or_else(_, _, R) -> R.

or_else([fun erlang:is_integer/1, fun erlang:is_atom/1, fun erlang:is_list/1], 3.23).

इस 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.

एफ#

let twice f = f >> f

let plus_three = (+) 3

let g = twice plus_three

g 7 |> printf "%A" // 13

गो

package main

import "fmt"

func twice(f func(int) int) func(int) int {
	return func(x int) int {
		return f(f(x))
	}
}

func main() {
	plusThree := func(i int) int {
		return i + 3
	}

	g := twice(plusThree)

	fmt.Println(g(7)) // 13
}

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

हास्केल

twice :: (Int -> Int) -> (Int -> Int)
twice f = f . f

plusThree :: Int -> Int
plusThree = (+3)

main :: IO ()
main = print (g 7) -- 13
  where
    g = twice plusThree

जे

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

   twice=.     adverb : 'u u y'

   plusthree=. verb   : 'y + 3'
   
   g=. plusthree twice
   
   g 7
13


   twice=. ^:2

   plusthree=. +&3
   
   g=. plusthree twice
   
   g 7
13

जावा (1.8+)

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

import java.util.function.*;

class Main {
    public static void main(String[] args) {
        Function<IntUnaryOperator, IntUnaryOperator> twice = f -> f.andThen(f);

        IntUnaryOperator plusThree = i -> i + 3;

        var g = twice.apply(plusThree);

        System.out.println(g.applyAsInt(7)); // 13
    }
}

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

import java.util.function.*;

class Main {
    private static IntUnaryOperator twice(IntUnaryOperator f) {
        return f.andThen(f);
    }

    private static int plusThree(int i) {
        return i + 3;
    }

    public static void main(String[] args) {
        var g = twice(Main::plusThree);

        System.out.println(g.applyAsInt(7)); // 13
    }
}

जावास्क्रिप्ट

तीर कार्यों के साथ:

"use strict";

const twice = f => x => f(f(x));

const plusThree = i => i + 3;

const g = twice(plusThree);

console.log(g(7)); // 13

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

"use strict";

function twice(f) {
  return function (x) {
    return f(f(x));
  };
}

function plusThree(i) {
  return i + 3;
}

const g = twice(plusThree);

console.log(g(7)); // 13

जूलिया

julia> function twice(f)
           function result(x)
               return f(f(x))
           end
           return result
       end
twice (generic function with 1 method)

julia> plusthree(i) = i + 3
plusthree (generic function with 1 method)

julia> g = twice(plusthree)
(::var"#result#3"{typeof(plusthree)}) (generic function with 1 method)

julia> g(7)
13

कोटलिन

fun twice(f: (Int) -> Int): (Int) -> Int {
    return { f(f(it)) }
}

fun plusThree(i: Int) = i + 3

fun main() {
    val g = twice(::plusThree)

    println(g(7)) // 13
}

दो

function twice(f)
  return function (x)
    return f(f(x))
  end
end

function plusThree(i)
  return i + 3
end

local g = twice(plusThree)

print(g(7)) -- 13

मतलब

function result = twice(f)
    result = @inner

    function val = inner(x)
        val = f(f(x));
    end
end

plusthree = @(i) i + 3;

g = twice(plusthree)

disp(g(7)); % 13

ओकैमल

let twice f x =
  f (f x)

let plus_three =
  (+) 3

let () =
  let g = twice plus_three in

  print_int (g 7); (* 13 *)
  print_newline ()







पीएचपी ==

<?php

declare(strict_types=1);

function twice(callable $f): Closure {
    return function (int $x) use ($f): int {
        return $f($f($x));
    };
}

function plusThree(int $i): int {
    return $i + 3;
}

$g = twice('plusThree');

echo $g(7), "\n"; // 13

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

<?php

declare(strict_types=1);

$twice = fn(callable $f): Closure => fn(int $x): int => $f($f($x));

$plusThree = fn(int $i): int => $i + 3;

$g = $twice($plusThree);

echo $g(7), "\n"; // 13

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

पर्ल

use strict;
use warnings;

sub twice {
    my ($f) = @_;
    sub {
        $f->($f->(@_));
    };
}

sub plusThree {
    my ($i) = @_;
    $i + 3;
}

my $g = twice(\&plusThree);

print $g->(7), "\n"; # 13

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

use strict;
use warnings;

my $twice = sub {
    my ($f) = @_;
    sub {
        $f->($f->(@_));
    };
};

my $plusThree = sub {
    my ($x) = @_;
    $x + 3;
};

my $g = $twice->($plusThree);

print $g->(7), "\n"; # 13

पायथन

>>> def twice(f):
...     def result(x):
...         return f(f(x))
...     return result

>>> plus_three = lambda i: i + 3

>>> g = twice(plus_three)
    
>>> g(7)
13

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

>>> @twice
... def g(i):
...     return i + 3

>>> g(7)
13


आर

twice <- function(f) {
  return(function(x) {
    f(f(x))
  })
}

plusThree <- function(i) {
  return(i + 3)
}

g <- twice(plusThree)

> print(g(7))
[1] 13

राकु

sub twice(Callable:D $f) {
    return sub { $f($f($^x)) };
}

sub plusThree(Int:D $i) {
    return $i + 3;
}

my $g = twice(&plusThree);

say $g(7); # 13

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

रुबी

def twice(f)
  ->(x) { f.call(f.call(x)) }
end

plus_three = ->(i) { i + 3 }

g = twice(plus_three)

puts g.call(7) # 13

जंग

fn twice(f: impl Fn(i32) -> i32) -> impl Fn(i32) -> i32 {
    move |x| f(f(x))
}

fn plus_three(i: i32) -> i32 {
    i + 3
}

fn main() {
    let g = twice(plus_three);

    println!("{}", g(7)) // 13
}

स्काला

object Main {
  def twice(f: Int => Int): Int => Int =
    f compose f

  def plusThree(i: Int): Int =
    i + 3

  def main(args: Array[String]): Unit = {
    val g = twice(plusThree)

    print(g(7)) // 13
  }
}


योजना

(define (add x y) (+ x y))
(define (f x)
  (lambda (y) (+ x y)))
(display ((f 3) 7))
(display (add 3 7))

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

तेज

func twice(_ f: @escaping (Int) -> Int) -> (Int) -> Int {
    return { f(f($0)) }
}

let plusThree = { $0 + 3 }

let g = twice(plusThree)

print(g(7)) // 13

टीसीएल

set twice {{f x} {apply $f [apply $f $x]}}
set plusThree {{i} {return [expr $i + 3]}}

# result: 13
puts [apply $twice $plusThree 7]

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

XACML

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

rule allowEntry{
    permit
    condition anyOfAny(function[stringEqual], citizenships, allowedCitizenships)
}

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

एक्सक्वायरी

declare function local:twice($f, $x) {
  $f($f($x))
};

declare function local:plusthree($i) {
  $i + 3
};

local:twice(local:plusthree#1, 7) (: 13 :)

विकल्प

फंक्शन पॉइंटर

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

#include <stdio.h>

double square(double x)
{
    return x * x;
}

double cube(double x)
{
    return x * x * x;
}

/* Compute the integral of f() within the interval [a,b] */
double integral(double f(double x), double a, double b, int n)
{
    int i;
    double sum = 0;
    double dt = (b - a) / n;
    for (i = 0;  i < n;  ++i) {
        sum += f(a + (i + 0.5) * dt);
    }
    return sum * dt;
}

int main()
{
    printf("%g\n", integral(square, 0, 1, 100));
    printf("%g\n", integral(cube, 0, 1, 100));
    return 0;
}

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

मैक्रोज़

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

डायनेमिक कोड मूल्यांकन

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

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

वस्तुएँ

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

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

program example;

type 
  int = integer;
  Txy = record x, y: int; end;
  Tf = function (xy: Txy): int;
     
function f(xy: Txy): int; 
begin 
  Result := xy.y + xy.x; 
end;

function g(func: Tf): Tf; 
begin 
  result := func; 
end;

var 
  a: Tf;
  xy: Txy = (x: 3; y: 7);

begin  
  a := g(@f);     // return a function to "a"
  writeln(a(xy)); // prints 10
end.

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

निष्क्रियता

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

// Defunctionalized function data structures
template<typename T> struct Add { T value; };
template<typename T> struct DivBy { T value; };
template<typename F, typename G> struct Composition { F f; G g; };

// Defunctionalized function application implementations
template<typename F, typename G, typename X>
auto apply(Composition<F, G> f, X arg) {
    return apply(f.f, apply(f.g, arg));
}

template<typename T, typename X>
auto apply(Add<T> f, X arg) {
    return arg  + f.value;
}

template<typename T, typename X>
auto apply(DivBy<T> f, X arg) {
    return arg / f.value;
}

// Higher-order compose function
template<typename F, typename G>
Composition<F, G> compose(F f, G g) {
    return Composition<F, G> {f, g};
}

int main(int argc, const char* argv[]) {
    auto f = compose(DivBy<float>{ 2.0f }, Add<int>{ 5 });
    apply(f, 3); // 4.0f
    apply(f, 9); // 7.0f
    return 0;
}

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

यह भी देखें

संदर्भ

  1. "PHP: Arrow Functions - Manual". www.php.net. Retrieved 2021-03-01.