प्रथम श्रेणी फंक्शन: Difference between revisions
No edit summary |
No edit summary |
||
(31 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
[[कंप्यूटर विज्ञान]] में, [[समारोह (प्रोग्रामिंग)|प्रोग्रामिंग]] भाषा को प्रथम श्रेणी के कार्यों वाला कहा जाता है यदि यह कार्य को प्रथम श्रेणी के विषय वस्तु के रूप में मानता है। इसका अर्थ यह है कि भाषा अन्य कार्यों के लिए तर्क के रूप में कार्यों को पारित करने, उन्हें अन्य कार्यों से मूल्यों के रूप में वापस करने और उन्हें चर को निर्दिष्ट करने या डेटा संरचनाओं में संग्रहीत करने का समर्थन करती है।<ref>{{cite book|first1=Harold|last1=Abelson|authorlink1=Harold Abelson|first2=Gerald Jay|last2=Sussman|authorlink2=Gerald Jay Sussman|title=कंप्यूटर प्रोग्राम की संरचना और व्याख्या|at=[https://archive.org/details/structureinterpr00abel/page/ Formulating Abstractions with Higher-Order Procedures]|publisher=MIT Press|year=1984|isbn=0-262-01077-1|url=https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-12.html#%_sec_1.3}}</ref> कुछ प्रोग्रामिंग भाषा सिद्धांतकारों को अज्ञात कार्यों | [[कंप्यूटर विज्ञान]] में, [[समारोह (प्रोग्रामिंग)|प्रोग्रामिंग]] भाषा को प्रथम श्रेणी के कार्यों वाला कहा जाता है यदि यह कार्य को प्रथम श्रेणी के विषय वस्तु के रूप में मानता है। इसका अर्थ यह है कि भाषा अन्य कार्यों के लिए तर्क के रूप में कार्यों को पारित करने, उन्हें अन्य कार्यों से मूल्यों के रूप में वापस करने और उन्हें चर को निर्दिष्ट करने या डेटा संरचनाओं में संग्रहीत करने का समर्थन करती है।<ref>{{cite book|first1=Harold|last1=Abelson|authorlink1=Harold Abelson|first2=Gerald Jay|last2=Sussman|authorlink2=Gerald Jay Sussman|title=कंप्यूटर प्रोग्राम की संरचना और व्याख्या|at=[https://archive.org/details/structureinterpr00abel/page/ Formulating Abstractions with Higher-Order Procedures]|publisher=MIT Press|year=1984|isbn=0-262-01077-1|url=https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-Z-H-12.html#%_sec_1.3}}</ref> कुछ प्रोग्रामिंग भाषा सिद्धांतकारों को, अज्ञात कार्यों के लिए भी समर्थन की आवश्यकता होती है।<ref name="test">[http://www.worldcat.org/oclc/222529448 Programming language pragmatics], by Michael Lee Scott, section 11.2 "Functional Programming".</ref> प्रथम श्रेणी के कार्यों वाली भाषाओं में, कार्यों के [[नाम (कंप्यूटर विज्ञान)|पहचानकर्ता (कंप्यूटर विज्ञान)]] की कोई विशेष स्थिति नहीं है, उन्हें कार्य प्रकार के साथ साधारण [[चर (कंप्यूटर विज्ञान)]] की तरह माना जाता है।<ref>{{cite journal |title=The Implementation of Lua 5.0 |author1=Roberto Ierusalimschy |author1-link=Roberto Ierusalimschy |author2=Luiz Henrique de Figueiredo |author3=Waldemar Celes |journal=Journal of Universal Computer Science |doi=10.3217/jucs-011-07-1159 |doi-access=free |volume=11 |issue=7 |date=2005 |pages=1159–1176}}</ref> यह शब्द [[क्रिस्टोफर स्ट्रेची]] द्वारा 1960 के दशक के मध्य में प्रथम श्रेणी के विषय वस्तु के रूप में कार्यों के संदर्भ में बनाया गया था।<ref name=strachey>{{cite journal|last1=Burstall |first1=Rod |last2=Strachey |first2=Christopher |title=प्रोग्रामिंग भाषाओं को समझना|journal=[[Higher-Order and Symbolic Computation]] |date=2000 |volume=13 |issue=52 |pages=11–49 |doi=10.1023/A:1010052305354 |s2cid=1989590 |url=http://www.cs.cmu.edu/~crary/819-f09/Strachey67.pdf |url-status=bot: unknown |archiveurl=https://web.archive.org/web/20100216060948/http://www.cs.cmu.edu/~crary/819-f09/Strachey67.pdf |archivedate=February 16, 2010 }} (also on 2010-02-16</ref> | ||
कार्यों | [[कार्यात्मक प्रोग्रामिंग]] शैली के लिए प्रथम श्रेणी के कार्य आवश्यक हैं, जिसमें उच्च-क्रम के कार्यों का उपयोग एक मानक अभ्यास है। उच्च-क्रम वाले कार्य का एक सरल उदाहरण आलेखन कार्य है, जो इसके तर्कों, कार्यों और सूची के रूप में लेता है, और सूची के प्रत्येक सदस्य को कार्य लागू करके बनाई गई सूची देता है। एक भाषा के लिए आलेखन का समर्थन करने के लिए, उसे एक तर्क के रूप में कार्य को पारित करने का समर्थन करना चाहिए। | ||
विशेष रूप से [[नेस्टेड समारोह|स्थिर कार्य]] और अनाम कार्य में प्रस्तुत किए गए [[गैर-स्थानीय चर]] की उपस्थिति में कार्यों को तर्कों के रूप में पारित करने या उन्हें परिणाम के रूप में वापस करने में कुछ कार्यान्वयन कठिनाइयाँ होती हैं। ऐतिहासिक रूप से, इन्हें [[फंगस की समस्या|फनर्ग की समस्या]] कहा जाता था, यह नाम कार्य तर्क से आता है।<ref>[[Joel Moses]]. [https://dspace.mit.edu/handle/1721.1/5854 "The Function of FUNCTION in LISP, or Why the FUNARG Problem Should be Called the Environment Problem"]. MIT AI Memo 199, 1970.</ref> प्रारंभिक अनिवार्य भाषाओं में इन समस्याओं को या तो परिणाम प्रकार (जैसे [[ALGOL 60|ऐल्गॉल 60]], [[पास्कल (प्रोग्रामिंग भाषा)|पारित्कल]]) के रूप में कार्यों का समर्थन न करने या [[नेस्टेड समारोह|स्थिर]] कार्यों और इस प्रकार गैर-स्थानीय चर (जैसे C) को छोड़ कर इन समस्याओं से बचा जा सकता था। शुरुआती कार्यात्मक भाषा [[लिस्प (प्रोग्रामिंग भाषा)|लिस्प]] ने [[गतिशील स्कोपिंग|गतिशील कार्यक्षेत्र]] का दृष्टिकोण अपनाया, जहां गैर-स्थानीय चर उस चर की निकटतम परिभाषा को उस बिंदु पर संदर्भित करते हैं जहां कार्य को निष्पादित किया गया था, बजाय जहां इसे परिभाषित किया गया था। [[लेक्सिकली स्कोप्ड]] प्रथम श्रेणी के कार्यों के लिए उचित समर्थन '''स्कीम''' (प्रोग्रामिंग [[लिस्प (प्रोग्रामिंग भाषा)|भाषा]]) में प्रस्तुत किया गया था और कार्यों के संदर्भों को अरक्षित [[समारोह सूचक|कार्य सूचक]] के बजाय समापन (कंप्यूटर विज्ञान) के रूप में संभालने की आवश्यकता होती है,<ref name="strachey" />जो बदले में [[कचरा संग्रह (कंप्यूटर विज्ञान)|अपशिष्ट संग्रह]] को एक आवश्यकता बनाता है। | |||
== अवधारणाएं == | == अवधारणाएं == | ||
इस खंड में, हम तुलना करते हैं कि विशेष प्रोग्रामिंग | इस खंड में, हम तुलना करते हैं कि विशेष प्रोग्रामिंग अभिव्यक्ति एक कार्यात्मक भाषा में प्रथम श्रेणी के कार्यों ([[हास्केल (प्रोग्रामिंग भाषा)|हास्केल]]) के साथ एक अनिवार्य भाषा की तुलना में कैसे संभाला जाता है जहां कार्य द्वितीय श्रेणी के विषय वस्तु (C प्रोग्रामिंग भाषा) हैं। | ||
=== उच्च-क्रम के कार्य: तर्कों के रूप में कार्यों को पारित करना === | === उच्च-क्रम के कार्य: तर्कों के रूप में कार्यों को पारित करना === | ||
उन भाषाओं में जहां कार्य प्रथम श्रेणी के विषय वस्तु हैं, कार्यों को अन्य मानों की तरह ही अन्य कार्यों के लिए तर्क के रूप में पारित किया जा सकता है। तर्क के रूप में किसी अन्य कार्य को लेने वाले कार्य को उच्च-क्रम कार्य कहा जाता है। हास्केल प्रोग्रामिंग भाषा में: | |||
उन भाषाओं में जहां कार्य प्रथम श्रेणी के | |||
<syntaxhighlight lang="haskell"> | <syntaxhighlight lang="haskell"> | ||
map :: (a -> b) -> [a] -> [b] | map :: (a -> b) -> [a] -> [b] | ||
Line 16: | Line 16: | ||
map f (x:xs) = f x : map f xs | map f (x:xs) = f x : map f xs | ||
</syntaxhighlight> | </syntaxhighlight> | ||
भाषाएं जहां कार्य प्रथम श्रेणी के नहीं होते हैं, फिर भी | भाषाएं जहां कार्य प्रथम श्रेणी के नहीं होते हैं, फिर भी कार्य सूचक या प्रतिनिधि (सीएलआई) जैसे सुविधाओं के उपयोग के माध्यम से उच्च-क्रम के कार्यों को लिखने की अनुमति देते हैं। सी प्रोग्रामिंग भाषा में: | ||
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
void map(int (*f)(int), int x[], size_t n) { | void map(int (*f)(int), int x[], size_t n) { | ||
Line 23: | Line 23: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
दो दृष्टिकोणों के बीच कई अंतर हैं जो सीधे प्रथम श्रेणी के कार्यों के समर्थन से संबंधित नहीं हैं। हास्केल | दो दृष्टिकोणों के बीच कई अंतर हैं जो सीधे प्रथम श्रेणी के कार्यों के समर्थन से संबंधित नहीं हैं। हास्केल प्रतिरूप [[सूची (कंप्यूटिंग)]] पर काम करता है, जबकि C प्रतिरूप [[सरणी डेटा संरचना]] पर काम करता है। दोनों संबंधित भाषाओं में सबसे प्राकृतिक यौगिक डेटा संरचनाएं हैं और C प्रतिरूप को संलग्न सूचियों पर संचालित करने से यह अनावश्यक रूप से जटिल हो जाता है। यह इस तथ्य के लिए भी जिम्मेदार है कि C कार्य को एक अतिरिक्त मापदंड(सरणी का आकार देते हुए) की आवश्यकता होती है। C कार्य सरणी को [[जगह में|उसी स्थान पर]] नवीनतम करता है पर कोई मान नहीं लौटाता है, जबकि हास्केल डेटा संरचनाओं में [[लगातार डेटा संरचना|निरंतर डेटा संरचना]] होती है जिसमे एक नई सूची वापस लौटा दिया जाता है जबकि पुराना बरकरार रहता है। हास्केल प्रतिरूप सूची को पार करने के लिए प्रत्यावर्तन का उपयोग करता है, जबकि सी प्रतिरूप पुनरावृत्ति का उपयोग करता है। पुनः, यह दोनों भाषाओं में इस कार्य को व्यक्त करने का सबसे स्वाभाविक तरीका है, लेकिन हास्केल प्रतिरूप आसानी से तह (उच्च-क्रम कार्य) और C प्रतिरूप [[ प्रत्यावर्तन |प्रत्यावर्तन]] के संदर्भ में व्यक्त किया जा सकता था। अंत में, हास्केल कार्य में एक [[बहुरूपता (कंप्यूटर विज्ञान)|बहुरूपता]] है, क्योंकि यह C द्वारा समर्थित नहीं है, इसलिए सभी प्रकार के चर को स्थिरांक <code>int</code> में स्थायी कर दिया गया है। | ||
=== अनाम और | === अनाम और स्थिर कार्य === | ||
अधिक जानकारी: अनाम कार्य और स्थिर कार्य | |||
अज्ञात कार्यों का समर्थन करने वाली भाषाओं में, | |||
अज्ञात कार्यों का समर्थन करने वाली भाषाओं में, इस तरह के कार्य को उच्च-क्रम कार्य के तर्क के रूप में पारित किया जा सकता है: | |||
<syntaxhighlight lang="haskell"> | <syntaxhighlight lang="haskell"> | ||
main = map (\x -> 3 * x + 1) [1, 2, 3, 4, 5] | main = map (\x -> 3 * x + 1) [1, 2, 3, 4, 5] | ||
</syntaxhighlight> | </syntaxhighlight> | ||
ऐसी भाषा में जो अज्ञात कार्यों का समर्थन नहीं करती है, | ऐसी भाषा में जो अज्ञात कार्यों का समर्थन नहीं करती है, इसे इसके बजाय नाम से बांधना होगा: | ||
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
int f(int x) { | int f(int x) { | ||
Line 43: | Line 44: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
'''<br />गैर-स्थानीय चर और समापन''' | |||
एक बार जब हमारे पास अनाम या स्थिर कार्य होते हैं, तो उनके लिए अपने समुदाय के बाहर के चरों को संदर्भित करना स्वाभाविक हो जाता है जिन्हें गैर-स्थानीय चर कहा जाता है: | |||
एक बार जब हमारे पास | |||
<syntaxhighlight lang="haskell"> | <syntaxhighlight lang="haskell"> | ||
main = let a = 3 | main = let a = 3 | ||
Line 53: | Line 52: | ||
in map (\x -> a * x + b) [1, 2, 3, 4, 5] | in map (\x -> a * x + b) [1, 2, 3, 4, 5] | ||
</syntaxhighlight> | </syntaxhighlight> | ||
यदि | यदि कार्य को अरक्षित कार्य सूचकों के साथ दर्शाया जाता है, तो हम अब यह नहीं जान सकते हैं कि कार्य के समुदाय के बाहर का मान इसे कैसे पारित किया जाना चाहिए, और इसके कारण एक समापन को हस्तचालित रूप से बनाने की आवश्यकता होती है। इसलिए हम यहाँ प्रथम श्रेणी के कार्यों की बात नहीं कर सकते। | ||
<syntaxhighlight lang="c"> | <syntaxhighlight lang="c"> | ||
Line 79: | Line 78: | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
यह भी ध्यान दें कि <code> | यह भी ध्यान दें कि<code>आलेखन</code>अब उनके पर्यावरण के बाहर दो <code>int</code>से संबंधित कार्यों के लिए विशिष्ट है। इसे अधिक सामान्यतौर पर स्थापित किया जा सकता है, लेकिन इसके लिए अधिक [[बॉयलरप्लेट कोड]] की आवश्यकता होती है। अगर <code>f</code> एक स्थिर कार्य होता तब भी उसी समस्या का सामना करना पड़ता और यही कारण है कि वे C में समर्थित नहीं हैं।<ref>"If you try to call the nested function through its address after the containing function has exited, all hell will break loose." ([https://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Nested-Functions.html#Nested-Functions GNU Compiler Collection: Nested Functions])</ref> | ||
'''<big>उच्च-क्रम के कार्य: परिणाम के रूप में कार्य लौटाना</big>''' | |||
किसी कार्य को वापस करते समय, हम वास्तव में उसके समापन को वापस कर रहे हैं। जब हम समापन बनाने वाले कार्य से वापस आ जाएंगे तब C उदाहरण में समापन द्वारा अधिकृत कर लिया गया कोई भी स्थानीय चर लक्ष्य से बाहर हो जाएगा। बाद के बिंदु पर बंद करने के लिए मजबूर करने से अपरिभाषित व्यवहार होगा, संभवतः ढेर को दूषित कर देगा। इसे ऊपर की ओर फनर्ग समस्या के रूप में जाना जाता है। | |||
=== चरों को कार्य सौंपना === | === चरों को कार्य सौंपना === | ||
[[ असाइनमेंट (कंप्यूटर विज्ञान) ]] | [[ असाइनमेंट (कंप्यूटर विज्ञान) | चर]](कंप्यूटर साइंस) को कार्य [[ असाइनमेंट (कंप्यूटर विज्ञान) |निर्दिष्ट]] [[ असाइनमेंट (कंप्यूटर विज्ञान) |करना]] और उन्हें (वैश्विक) डेटा संरचनाएं के अंदर संग्रहीत करने से संभावित रूप से रिटर्निंग कार्य के समान कठिनाइयों से पीड़ित होता है। | ||
<syntaxhighlight lang="haskell"> | <syntaxhighlight lang="haskell"> | ||
f :: [[Integer] -> [Integer]] | f :: [[Integer] -> [Integer]] | ||
Line 94: | Line 93: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
'''कार्यों की समानता''' | |||
जैसा कि कोई समानता के लिए अधिकांश शाब्दिक और उपयोगिता का परीक्षण कर सकता है, यह पूछना स्वाभाविक है कि क्या कोई प्रोग्रामिंग भाषा समानता के लिए परीक्षण कार्यों का समर्थन कर सकती है। आगे के निरीक्षण पर, यह प्रश्न अधिक कठिन प्रतीत होता है और व्यक्ति को कई प्रकार की कार्य समानता के बीच अंतर करना पड़ता है।<ref>[[Andrew W. Appel]] (1995). [http://www.cs.princeton.edu/~appel/papers/conteq.pdf "Intensional Equality ;=) for Continuations"].</ref> | |||
; विस्तारात्मक समानता: दो कार्य f और g को व्यापक रूप से समान माना जाता है यदि वे सभी निविष्ट (∀x. f(x) = g(x)) के लिए अपने उत्पादन पर सहमत होते है। उदाहरण के लिए, समानता की इस परिभाषा के अंतर्गत एक [[स्थिर छँटाई एल्गोरिथ्म|स्थिर प्रकार एल्गोरिथ्म]] के किसी भी दो कार्यान्वयन, जैसे कि सम्मिलन प्रकार और मर्ज प्रकार, को समान माना जाएगा। [[विस्तृत समानता]] पर निर्णय लेना सामान्य रूप से [[अनिर्णीत समस्या]] है और यहां तक कि परिमित कार्यक्षेत्र वाले कार्यों के लिए भी अक्सर कठिन होता है। इस कारण से कोई प्रोग्रामिंग भाषा कार्य समानता को विस्तारित समानता के रूप में लागू नहीं करती है। | |||
: [[गहन समानता|'''गहन समानता''']] | |||
जैसा कि कोई समानता के लिए अधिकांश शाब्दिक और | :[[गहन समानता|'''गहन''']] समानता के अंतर्गत, दो फलन f और g को समान माना जाता है यदि उनकी आंतरिक संरचना समान हो। इस तरह की समानता [[व्याख्या की गई भाषा]]ओं में कार्य निकायों के स्रोत कोड (जैसे व्याख्या किए गए लिस्प 1.5 में) या [[संकलित भाषा]]ओं में [[ वस्तु कोड |वस्तु कोड]] की तुलना करके कार्यान्वित की जा सकती है। [[गहन समानता|'''गहन''']] समानता का तात्पर्य विस्तारात्मक समानता यह मानते हुए कि कार्य नियतात्मक हैं और उनमें कोई छिपा हुआ निविष्ट नहीं है, जैसे कि [[ कार्यक्रम गणक |कार्यक्रम गणक]] या एक परिवर्तनशील [[वैश्विक चर]] से है। | ||
; विस्तारात्मक समानता: दो | :[[संदर्भ समानता|'''संदर्भ समानता''']] | ||
: विस्तारात्मक और गहन समानता को लागू करने की अव्यावहारिकता को देखते हुए, समानता के लिए परीक्षण कार्यों का समर्थन करने वाली अधिकांश भाषाएं संदर्भ समानता का उपयोग करती हैं। सभी कार्यों या समापन को एक अद्वितीय पहचानकर्ता (सामान्यतौर पर कार्य रचना या समापन का पता) [[ असाइनमेंट (कंप्यूटर विज्ञान) |निर्दिष्ट]] किया जाता है और पहचानकर्ता की समानता के आधार पर समानता तय की जाती है। दो अलग-अलग परिभाषित, लेकिन अन्यथा समान कार्य परिभाषाओं को असमान माना जाएगा। संदर्भपरक समानता का तात्पर्य गहन और विस्तारात्मक समानता से है। [[संदर्भ समानता|'''संदर्भात्मक''']] समानता संदर्भित पारदर्शिता को तोड़ती है और इसलिए हास्केल जैसी [[शुद्धता (कंप्यूटर विज्ञान)|शुद्ध]] भाषाओं में समर्थित नहीं है। | |||
== प्रकार सिद्धांत == | == प्रकार सिद्धांत == | ||
[[प्रकार सिद्धांत]] में, प्रकार ''A'' के मानों को स्वीकार करने वाले कार्यों के प्रकार और प्रकार B के मान को वापस करने के लिए ''A'' → ''B'' या ''B <sup>A</sup>'' के रूप में लिखा जा सकता है। करी-हावर्ड पत्राचार में, प्रकार्य प्रकार तार्किक निहितार्थ से संबंधित हैं; लैम्ब्डा एब्स्ट्रैक्शन काल्पनिक मान्यताओं के निर्वहन से मेल खाता है और कार्य अनुप्रयोग मॉडस पोनेंस अनुमान नियम से मेल खाता है। प्रोग्रामिंग कार्य के सामान्य स्तिथियों के अतिरिक्त, टाइप थ्योरी भी सहयोगी सरणियों और समान डेटा संरचनाओं को प्रतिरूप करने के लिए प्रथम श्रेणी के कार्य का उपयोग करती है। | |||
[[प्रकार सिद्धांत]] में, प्रकार | |||
[[श्रेणी सिद्धांत]] | प्रोग्रामिंग के [[श्रेणी सिद्धांत]] गणना में, प्रथम श्रेणी के कार्यों की उपलब्धता [[बंद श्रेणी]] की धारणा से मेल खाती है। उदाहरण के लिए, केवल टाइप किया गया लैम्ब्डा कैलकुस [[कार्टेशियन बंद श्रेणी]] की आंतरिक भाषा के समान होता है। | ||
== भाषा समर्थन == | == भाषा समर्थन == | ||
कार्यात्मक प्रोग्रामिंग भाषाएं, जैसे एर्लांग, स्कीम, एमएल, हास्केल, एफ# और स्काला सभी में प्रथम श्रेणी के कार्य हैं। जब शुरुआती कार्यात्मक भाषाओं में से एक लिस्प को डिजाइन किया गया था, तब प्रथम श्रेणी के कार्यों के सभी पहलुओं को ठीक से नहीं समझा गया था, जिसके परिणामस्वरूप कार्यों को गतिशील रूप से लक्षित किया गया था। बाद की स्कीम और [[ सामान्य लिस्प |सामान्य लिस्प]] उपभाषाओं में प्रथम श्रेणी के कार्यों को शाब्दिक रूप से लक्षित किया गया था। | |||
[[पर्ल]], पायथन | [[पर्ल]], पायथन, [[PHP|पीएचपी]], [[ लुआ (प्रोग्रामिंग भाषा) |लुआ (प्रोग्रामिंग भाषा)]], [[Tcl|'''टीसीएल''']] / टीके, [[जावास्क्रिप्ट]] और आईओ सहित कई स्क्रिप्टिंग भाषाओं में प्रथम श्रेणी के कार्य हैं। | ||
अनिवार्य भाषाओं के लिए, अल्गोल और उसके | अनिवार्य भाषाओं के लिए, अल्गोल और उसके श्रेणियों जैसे पास्कल, पारंपरिक C श्रेणी और आधुनिक [[कचरा संग्रह (कंप्यूटर विज्ञान)|अपशिष्ट]]-संग्रहित रूपांतर के बीच अंतर करना पड़ता है। अल्गोल श्रेणी ने स्थिर कार्य और उच्च-क्रम लेने वाले कार्य को तर्कों के रूप में अनुमति दी है, लेकिन अल्गोल 68 को छोड़कर उच्च-क्रम वाले कार्य को अनुमति नहीं देता है जो परिणाम के रूप में कार्य लौटाते हैं। इसका कारण यह था कि पहले यह ज्ञात नहीं था कि यदि परिणाम के रूप में एक स्थिर कार्य लौटाया जाता है तो गैर-स्थानीय चर से कैसे समझौता करना है और ऐसी स्तिथियों में एल्गोल 68 रनटाइम त्रुटियाँ पैदा करता है। | ||
C श्रेणी ने तर्कों के रूप में पारित होने वाले कार्यों और उन्हें परिणाम के रूप में वापस करने की अनुमति दी थी लेकिन स्थिर कार्यों का समर्थन न करके किसी भी समस्या से बचाव किया गया था। जीसीसी संकलनकर्ता उन्हें एक विस्तार के रूप में अनुमति देता है। चूंकि रिटर्निंग कार्य की उपयोगिता मुख्य रूप से स्थिर कार्य को वापस करने की क्षमता में निहित है, जो शीर्ष-स्तरीय कार्य के बजाय गैर-स्थानीय चर को अधीन कर लिया है, इन भाषाओं को सामान्यतौर पर पहले प्रथम श्रेणी कार्यों में नहीं माना जाता है। | |||
आधुनिक अनिवार्य भाषाएं अक्सर कचरा-संग्रह का समर्थन करती हैं जिससे प्रथम श्रेणी के कार्यों का कार्यान्वयन संभव हो जाता है। प्रथम श्रेणी के कार्यों को अक्सर भाषा के बाद के संशोधनों में समर्थित किया गया है, जिसमें C# 2.0 और | आधुनिक अनिवार्य भाषाएं अक्सर [[कचरा संग्रह (कंप्यूटर विज्ञान)|अपशिष्ट]]-संग्रह का समर्थन करती हैं जिससे प्रथम श्रेणी के कार्यों का कार्यान्वयन संभव हो जाता है। प्रथम श्रेणी के कार्यों को अक्सर भाषा के बाद के संशोधनों में समर्थित किया गया है, जिसमें C# 2.0 और एप्पल के खंड विस्तार से C, C++ और ऑब्जेक्टिव -C सम्मिलित हैं। C++11 ने अनाम कार्यों और भाषा के बंद होने के लिए समर्थन जोड़ा है, लेकिन भाषा की गैर-[[कचरा संग्रह (कंप्यूटर विज्ञान)|अपशिष्ट]] एकत्र प्रकृति के कारण, परिणाम के रूप में लौटाए जाने वाले कार्यों में गैर-स्थानीय चर के लिए विशेष ध्यान रखना पड़ता है (नीचे देखें) ); | ||
{| class="wikitable" | |||
{| class=wikitable | |- | ||
! colspan=2 rowspan=2 | भाषा | ! colspan="2" rowspan="2" |भाषा | ||
! colspan="2" |उच्च-क्रम के कार्य | |||
! colspan="2" |नेस्टेड फ़ंक्शन | |||
! colspan="2" |गैर-स्थानीय चर | |||
! rowspan="2" |टिप्पणियाँ | |||
|- | |- | ||
! | !बहस | ||
!परिणाम | |||
!नामांकित | |||
!अनाम | |||
!बंद | |||
!आंशिक आवेदन | |||
|- | |- | ||
| rowspan=6 | | | rowspan="6" |अल्गोल परिवार | ||
| | |एल्गोल 60 | ||
|हाँ | |||
|नहीं | |||
|हाँ | |||
|नहीं | |||
|नीचे की ओर | |||
|नहीं | |||
| rowspan="6" |फ़ंक्शन प्रकार हैं । | |||
|- | |- | ||
| | |एल्गोल 68 | ||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|नीचे की ओर | |||
|नहीं | |||
|- | |- | ||
| | |पास्कल | ||
|हाँ | |||
|नहीं | |||
|हाँ | |||
|नहीं | |||
|नीचे की ओर | |||
|नहीं | |||
|- | |- | ||
| | |एडीए | ||
|हाँ | |||
|नहीं | |||
|हाँ | |||
|नहीं | |||
|नीचे की ओर | |||
|नहीं | |||
|- | |- | ||
| | |ओबेरोन | ||
|हाँ | |||
|केवल गैर-नेस्टेड | |||
|हाँ | |||
|नहीं | |||
|नीचे की ओर | |||
|नहीं | |||
|- | |- | ||
| | |डेल्फी | ||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|2009 | |||
|2009 | |||
|नहीं | |||
|- | |- | ||
| rowspan=9 | | | rowspan="9" |सी परिवार | ||
| | |सी | ||
|हाँ | |||
|हाँ | |||
|हाँ जीएनयू सी में | |||
|हाँ क्लैंग में ( ब्लॉक ) | |||
|हाँ क्लैंग में ( ब्लॉक ) | |||
|नहीं | |||
|फ़ंक्शन पॉइंटर्स हैं । | |||
|- | |- | ||
| | |सी++ | ||
|हाँ | |||
|हाँ | |||
|सी++11 | |||
|सी++11 | |||
|सी++11 | |||
|सी++11 | |||
|इसमें फ़ंक्शन पॉइंटर्स, फ़ंक्शन ऑब्जेक्ट हैं । (इसके अलावा, नीचे देखें।) | |||
के साथ स्पष्ट आंशिक अनुप्रयोग संभव है <code>std::bind</code>। | |||
|- | |- | ||
| | |सी# | ||
|हाँ | |||
|हाँ | |||
|7 | |||
|2.0/3.0 | |||
|2.0 | |||
|3.0 | |||
|इसमें डेलीगेट्स (2.0) और लैम्ब्डा एक्सप्रेशन (3.0) हैं। | |||
|- | |- | ||
| | |उद्देश्य सी | ||
|हाँ | |||
|हाँ | |||
|अनाम का उपयोग करना | |||
|2.0 + ब्लॉक | |||
|2.0 + ब्लॉक | |||
|नहीं | |||
|फ़ंक्शन पॉइंटर्स हैं. | |||
|- | |- | ||
| | |जावा | ||
|हाँ | |||
|हाँ | |||
|अनाम का उपयोग करना | |||
|जावा 8 | |||
|जावा 8 | |||
|हाँ | |||
|अनाम आंतरिक कक्षाएं हैं । | |||
|- | |- | ||
| | |जाना | ||
|हाँ | |||
|हाँ | |||
|अनाम का उपयोग करना | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
| | |||
|- | |- | ||
| | |लीम्बो | ||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|नहीं | |||
| | |||
|- | |- | ||
| | |न्यूज़वीक | ||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|नहीं | |||
| | |||
|- | |- | ||
| | |जंग | ||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
| | |||
|- | |- | ||
| rowspan=11 | | | rowspan="11" |कार्यात्मक भाषाएँ | ||
|तुतलाना | |||
|वाक्य - विन्यास | |||
|वाक्य - विन्यास | |||
|हाँ | |||
|हाँ | |||
|सामान्य लिस्प | |||
|नहीं | |||
|(नीचे देखें) | |||
|- | |- | ||
| | |योजना | ||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|एसआरएफआई 26 | |||
| | |||
|- | |- | ||
| | |जूलिया | ||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
| | |||
|- | |- | ||
| | |क्लोजर | ||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
| | |||
|- | |- | ||
| | |एमएल | ||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
| | |||
|- | |- | ||
| | |हास्केल | ||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
| | |||
|- | |- | ||
| | |jq | ||
|हाँ | |||
|नहीं | |||
|हाँ | |||
|केवल अभिव्यक्तियाँ | |||
|नीचे की ओर | |||
|नहीं | |||
|- | |- | ||
| | |स्काला | ||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
| | |||
|- | |- | ||
| | |Erlang | ||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
| | |||
|- | |- | ||
| | |एफ# | ||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
| | |||
|- | |- | ||
| | |ओकैमल | ||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
| | |||
|- | |- | ||
| rowspan=7 | | | rowspan="7" |स्क्रिप्टिंग भाषाएँ | ||
| | |आईओ | ||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|नहीं | |||
| | |||
|- | |- | ||
| | |जावास्क्रिप्ट | ||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|ईसीएमएस्क्रिप्ट 5 | |||
|ES3 पर उपयोगकर्ता-भूमि कोड के साथ आंशिक आवेदन संभव है | |||
|- | |- | ||
| | |लुआ | ||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
| | |||
|- | |- | ||
| | |पीएचपी | ||
|हाँ | |||
|हाँ | |||
|अनाम का उपयोग करना | |||
|5.3 | |||
|5.3 | |||
|नहीं | |||
|उपयोगकर्ता-भूमि कोड के साथ आंशिक आवेदन संभव है। | |||
|- | |- | ||
| | |पर्ल | ||
|हाँ | |||
|हाँ | |||
|6 | |||
|हाँ | |||
|हाँ | |||
|6 | |||
| | |||
|- | |- | ||
| | |अजगर | ||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|केवल अभिव्यक्तियाँ | |||
|हाँ | |||
|2.5 | |||
|(नीचे देखें) | |||
|- | |- | ||
| | |माणिक | ||
|वाक्य - विन्यास | |||
|वाक्य - विन्यास | |||
|अनस्कोप्ड | |||
|हाँ | |||
|हाँ | |||
|1.9 | |||
|(नीचे देखें) | |||
|- | |- | ||
| rowspan=6 | | | rowspan="6" |अन्य भाषाएं | ||
| | |फोरट्रान | ||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|नहीं | |||
|नहीं | |||
|नहीं | |||
| | |||
|- | |- | ||
| | |मेपल | ||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|नहीं | |||
| | |||
|- | |- | ||
| | |मेथेमेटिका | ||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|नहीं | |||
| | |||
|- | |- | ||
| | |मतलब | ||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|नए कार्यों की स्वचालित पीढ़ी द्वारा आंशिक अनुप्रयोग संभव। | |||
|- | |- | ||
| | |गपशप | ||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|आंशिक | |||
|पुस्तकालय के माध्यम से आंशिक आवेदन संभव। | |||
|- | |- | ||
| | |तीव्र | ||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|हाँ | |||
|} | |} | ||
; सी ++: [[सी ++ 11]] | ; सी ++: [[सी ++ 11]] समापन गैर-स्थानीय चर को प्रतिलिपि निर्माण, संदर्भ द्वारा (उनके जीवनकाल को बढ़ाए बिना), या स्थानांतरित निर्माण द्वारा (वेरिएबल तब तक रहता है जब तक समापन रहता है) अधीन कर सकता है। यदि समापन लौटाया जाता है तो पहला विकल्प सुरक्षित है लेकिन एक प्रतिलिपि की आवश्यकता होती है और इसका उपयोग मूल चर को संशोधित करने के लिए नहीं किया जा सकता है जो समापन कहे जाने के समय उपलब्ध नहीं हो सकता है। दूसरा विकल्प संभावित रूप से एक महंगी प्रतिलिपि से बचता है और मूल चर को संशोधित करने की अनुमति देता है लेकिन बंद होने की स्थिति में असुरक्षित है। तीसरा विकल्प सुरक्षित है अगर समापन लौटाया जाता है और प्रतिलिपि की आवश्यकता नहीं होती है लेकिन मूल चर को संशोधित करने के लिए भी इसका उपयोग नहीं किया जा सकता है। | ||
; जावा: [[जावा 8]] | ; जावा: [[जावा 8]] समापन केवल अंतिम या प्रभावी रूप से अंतिम गैर-स्थानीय चर को अधीन कर सकते हैं। अनाम कार्य संदर्भ से अनुमानित प्रकार लेते हैं और जावा के कार्य प्रकारों को श्रेणियों के रूप में दर्शाया जाता है। विधि संदर्भ सीमित हैं। | ||
; | ; लिस्प | ||
: लेक्सिकली | : लेक्सिकली लक्षित लिस्प रूपांतर समापन का समर्थन करता है। गतिशील रूप से लक्षित किए गए रूपांतर समापन का समर्थन नहीं करते हैं या समापन बनाने के लिए एक विशेष निर्माण की आवश्यकता होती है।<ref>[https://common-lisp.net/project/bknr/static/lmman/fd-clo.xml Closures in ZetaLisp] {{webarchive|url=https://web.archive.org/web/20120319071329/http://common-lisp.net/project/bknr/static/lmman/fd-clo.xml |date=2012-03-19 }}</ref> | ||
: सामान्य लिस्प में, | : सामान्य लिस्प में, कार्य नेमस्पेस में कार्य के पहचानकर्ता को प्रथम श्रेणी के मान के संदर्भ के रूप में उपयोग नहीं किया जा सकता है। <code>function</code> कार्य को मान के रूप में पुनर्प्राप्त करने के लिए विशेष संचालिका का उपयोग किया जाना चाहिए: <code>(function foo)</code> एक कार्य वस्तु का मूल्यांकन करता है।<code>#'foo</code> आशुलिपि संकेतन के रूप में उपलब्ध है। इस तरह के कार्य वस्तु को लागू करने के लिए, <code>funcall</code>कार्य <code>(funcall #'foo bar baz)</code>का उपयोग करना चाहिए। | ||
; | ; पाइथन | ||
: | : <code>[https://docs.python.org/library/functools.html#functools.partial functools.partial]</code> संस्करण 2.5 से और <code>[https://docs.python.org/library/operator.html#operator.methodcaller operator.methodcaller]</code> संस्करण 2.6 से स्पष्ट आंशिक अनुप्रयोग। | ||
; | ; रूबी | ||
: रूबी (जो वास्तव में एक विधि है) में नियमित कार्य के पहचानकर्ता को | : रूबी (जो वास्तव में एक विधि है) में नियमित कार्य के पहचानकर्ता को मान के रूप में उपयोग या पारित नहीं किया जा सकता है। प्रथम श्रेणी डेटा के रूप में उपयोग करने के लिए इसे पहले किसी <code>Method</code> या <code>Proc</code>वस्तु में पुनर्प्राप्त किया जाना चाहिए। स्पष्ट रूप से स्थिर विधि परिभाषाएँ वास्तव में लक्ष्य को स्थिर नहीं करती हैं, ऐसे कार्य वस्तु को कॉल करने की संरचना अन्य नियमित तरीकों को कॉल करने से भिन्न होती है। <code>[http://www.ruby-doc.org/core-1.9.3/Proc.html#method-i-curry]</code>. | ||
== यह भी देखें == | == यह भी देखें == | ||
Line 245: | Line 514: | ||
{{data types}} | {{data types}} | ||
{{DEFAULTSORT:First-class function}} | {{DEFAULTSORT:First-class function}} | ||
[[Category: | [[Category:CS1 maint]] | ||
[[Category:Created On 16/06/2023]] | [[Category:Collapse templates|First-class function]] | ||
[[Category:Created On 16/06/2023|First-class function]] | |||
[[Category:Machine Translated Page|First-class function]] | |||
[[Category:Navigational boxes| ]] | |||
[[Category:Navigational boxes without horizontal lists|First-class function]] | |||
[[Category:Pages with script errors|First-class function]] | |||
[[Category:Sidebars with styles needing conversion|First-class function]] | |||
[[Category:Template documentation pages|Documentation/doc]] | |||
[[Category:Templates Vigyan Ready]] | |||
[[Category:Templates generating microformats|First-class function]] | |||
[[Category:Templates that are not mobile friendly|First-class function]] | |||
[[Category:Templates using TemplateData|First-class function]] | |||
[[Category:Webarchive template wayback links]] | |||
[[Category:Wikipedia metatemplates|First-class function]] | |||
[[Category:आदिम प्रकार|First-class function]] | |||
[[Category:उदाहरण सी कोड वाले लेख|First-class function]] | |||
[[Category:उदाहरण हास्केल कोड वाले लेख|First-class function]] | |||
[[Category:कार्यात्मक प्रोग्रामिंग|First-class function]] | |||
[[Category:डेटा के प्रकार|First-class function]] | |||
[[Category:प्रोग्रामिंग भाषा सिद्धांत|First-class function]] | |||
[[Category:संकलक निर्माण|First-class function]] | |||
[[Category:सबरूटीन्स|First-class function]] |
Latest revision as of 20:11, 5 July 2023
कंप्यूटर विज्ञान में, प्रोग्रामिंग भाषा को प्रथम श्रेणी के कार्यों वाला कहा जाता है यदि यह कार्य को प्रथम श्रेणी के विषय वस्तु के रूप में मानता है। इसका अर्थ यह है कि भाषा अन्य कार्यों के लिए तर्क के रूप में कार्यों को पारित करने, उन्हें अन्य कार्यों से मूल्यों के रूप में वापस करने और उन्हें चर को निर्दिष्ट करने या डेटा संरचनाओं में संग्रहीत करने का समर्थन करती है।[1] कुछ प्रोग्रामिंग भाषा सिद्धांतकारों को, अज्ञात कार्यों के लिए भी समर्थन की आवश्यकता होती है।[2] प्रथम श्रेणी के कार्यों वाली भाषाओं में, कार्यों के पहचानकर्ता (कंप्यूटर विज्ञान) की कोई विशेष स्थिति नहीं है, उन्हें कार्य प्रकार के साथ साधारण चर (कंप्यूटर विज्ञान) की तरह माना जाता है।[3] यह शब्द क्रिस्टोफर स्ट्रेची द्वारा 1960 के दशक के मध्य में प्रथम श्रेणी के विषय वस्तु के रूप में कार्यों के संदर्भ में बनाया गया था।[4]
कार्यात्मक प्रोग्रामिंग शैली के लिए प्रथम श्रेणी के कार्य आवश्यक हैं, जिसमें उच्च-क्रम के कार्यों का उपयोग एक मानक अभ्यास है। उच्च-क्रम वाले कार्य का एक सरल उदाहरण आलेखन कार्य है, जो इसके तर्कों, कार्यों और सूची के रूप में लेता है, और सूची के प्रत्येक सदस्य को कार्य लागू करके बनाई गई सूची देता है। एक भाषा के लिए आलेखन का समर्थन करने के लिए, उसे एक तर्क के रूप में कार्य को पारित करने का समर्थन करना चाहिए।
विशेष रूप से स्थिर कार्य और अनाम कार्य में प्रस्तुत किए गए गैर-स्थानीय चर की उपस्थिति में कार्यों को तर्कों के रूप में पारित करने या उन्हें परिणाम के रूप में वापस करने में कुछ कार्यान्वयन कठिनाइयाँ होती हैं। ऐतिहासिक रूप से, इन्हें फनर्ग की समस्या कहा जाता था, यह नाम कार्य तर्क से आता है।[5] प्रारंभिक अनिवार्य भाषाओं में इन समस्याओं को या तो परिणाम प्रकार (जैसे ऐल्गॉल 60, पारित्कल) के रूप में कार्यों का समर्थन न करने या स्थिर कार्यों और इस प्रकार गैर-स्थानीय चर (जैसे C) को छोड़ कर इन समस्याओं से बचा जा सकता था। शुरुआती कार्यात्मक भाषा लिस्प ने गतिशील कार्यक्षेत्र का दृष्टिकोण अपनाया, जहां गैर-स्थानीय चर उस चर की निकटतम परिभाषा को उस बिंदु पर संदर्भित करते हैं जहां कार्य को निष्पादित किया गया था, बजाय जहां इसे परिभाषित किया गया था। लेक्सिकली स्कोप्ड प्रथम श्रेणी के कार्यों के लिए उचित समर्थन स्कीम (प्रोग्रामिंग भाषा) में प्रस्तुत किया गया था और कार्यों के संदर्भों को अरक्षित कार्य सूचक के बजाय समापन (कंप्यूटर विज्ञान) के रूप में संभालने की आवश्यकता होती है,[4]जो बदले में अपशिष्ट संग्रह को एक आवश्यकता बनाता है।
अवधारणाएं
इस खंड में, हम तुलना करते हैं कि विशेष प्रोग्रामिंग अभिव्यक्ति एक कार्यात्मक भाषा में प्रथम श्रेणी के कार्यों (हास्केल) के साथ एक अनिवार्य भाषा की तुलना में कैसे संभाला जाता है जहां कार्य द्वितीय श्रेणी के विषय वस्तु (C प्रोग्रामिंग भाषा) हैं।
उच्च-क्रम के कार्य: तर्कों के रूप में कार्यों को पारित करना
उन भाषाओं में जहां कार्य प्रथम श्रेणी के विषय वस्तु हैं, कार्यों को अन्य मानों की तरह ही अन्य कार्यों के लिए तर्क के रूप में पारित किया जा सकता है। तर्क के रूप में किसी अन्य कार्य को लेने वाले कार्य को उच्च-क्रम कार्य कहा जाता है। हास्केल प्रोग्रामिंग भाषा में:
map :: (a -> b) -> [a] -> [b]
map f [] = []
map f (x:xs) = f x : map f xs
भाषाएं जहां कार्य प्रथम श्रेणी के नहीं होते हैं, फिर भी कार्य सूचक या प्रतिनिधि (सीएलआई) जैसे सुविधाओं के उपयोग के माध्यम से उच्च-क्रम के कार्यों को लिखने की अनुमति देते हैं। सी प्रोग्रामिंग भाषा में:
void map(int (*f)(int), int x[], size_t n) {
for (int i = 0; i < n; i++)
x[i] = f(x[i]);
}
दो दृष्टिकोणों के बीच कई अंतर हैं जो सीधे प्रथम श्रेणी के कार्यों के समर्थन से संबंधित नहीं हैं। हास्केल प्रतिरूप सूची (कंप्यूटिंग) पर काम करता है, जबकि C प्रतिरूप सरणी डेटा संरचना पर काम करता है। दोनों संबंधित भाषाओं में सबसे प्राकृतिक यौगिक डेटा संरचनाएं हैं और C प्रतिरूप को संलग्न सूचियों पर संचालित करने से यह अनावश्यक रूप से जटिल हो जाता है। यह इस तथ्य के लिए भी जिम्मेदार है कि C कार्य को एक अतिरिक्त मापदंड(सरणी का आकार देते हुए) की आवश्यकता होती है। C कार्य सरणी को उसी स्थान पर नवीनतम करता है पर कोई मान नहीं लौटाता है, जबकि हास्केल डेटा संरचनाओं में निरंतर डेटा संरचना होती है जिसमे एक नई सूची वापस लौटा दिया जाता है जबकि पुराना बरकरार रहता है। हास्केल प्रतिरूप सूची को पार करने के लिए प्रत्यावर्तन का उपयोग करता है, जबकि सी प्रतिरूप पुनरावृत्ति का उपयोग करता है। पुनः, यह दोनों भाषाओं में इस कार्य को व्यक्त करने का सबसे स्वाभाविक तरीका है, लेकिन हास्केल प्रतिरूप आसानी से तह (उच्च-क्रम कार्य) और C प्रतिरूप प्रत्यावर्तन के संदर्भ में व्यक्त किया जा सकता था। अंत में, हास्केल कार्य में एक बहुरूपता है, क्योंकि यह C द्वारा समर्थित नहीं है, इसलिए सभी प्रकार के चर को स्थिरांक int
में स्थायी कर दिया गया है।
अनाम और स्थिर कार्य
अधिक जानकारी: अनाम कार्य और स्थिर कार्य
अज्ञात कार्यों का समर्थन करने वाली भाषाओं में, इस तरह के कार्य को उच्च-क्रम कार्य के तर्क के रूप में पारित किया जा सकता है:
main = map (\x -> 3 * x + 1) [1, 2, 3, 4, 5]
ऐसी भाषा में जो अज्ञात कार्यों का समर्थन नहीं करती है, इसे इसके बजाय नाम से बांधना होगा:
int f(int x) {
return 3 * x + 1;
}
int main() {
int list[] = {1, 2, 3, 4, 5};
map(f, list, 5);
}
गैर-स्थानीय चर और समापन
एक बार जब हमारे पास अनाम या स्थिर कार्य होते हैं, तो उनके लिए अपने समुदाय के बाहर के चरों को संदर्भित करना स्वाभाविक हो जाता है जिन्हें गैर-स्थानीय चर कहा जाता है:
main = let a = 3
b = 1
in map (\x -> a * x + b) [1, 2, 3, 4, 5]
यदि कार्य को अरक्षित कार्य सूचकों के साथ दर्शाया जाता है, तो हम अब यह नहीं जान सकते हैं कि कार्य के समुदाय के बाहर का मान इसे कैसे पारित किया जाना चाहिए, और इसके कारण एक समापन को हस्तचालित रूप से बनाने की आवश्यकता होती है। इसलिए हम यहाँ प्रथम श्रेणी के कार्यों की बात नहीं कर सकते।
typedef struct {
int (*f)(int, int, int);
int *a;
int *b;
} closure_t;
void map(closure_t *closure, int x[], size_t n) {
for (int i = 0; i < n; ++i)
x[i] = (*closure->f)(*closure->a, *closure->b, x[i]);
}
int f(int a, int b, int x) {
return a * x + b;
}
void main() {
int l[] = {1, 2, 3, 4, 5};
int a = 3;
int b = 1;
closure_t closure = {f, &a, &b};
map(&closure, l, 5);
}
यह भी ध्यान दें किआलेखन
अब उनके पर्यावरण के बाहर दो int
से संबंधित कार्यों के लिए विशिष्ट है। इसे अधिक सामान्यतौर पर स्थापित किया जा सकता है, लेकिन इसके लिए अधिक बॉयलरप्लेट कोड की आवश्यकता होती है। अगर f
एक स्थिर कार्य होता तब भी उसी समस्या का सामना करना पड़ता और यही कारण है कि वे C में समर्थित नहीं हैं।[6]
उच्च-क्रम के कार्य: परिणाम के रूप में कार्य लौटाना
किसी कार्य को वापस करते समय, हम वास्तव में उसके समापन को वापस कर रहे हैं। जब हम समापन बनाने वाले कार्य से वापस आ जाएंगे तब C उदाहरण में समापन द्वारा अधिकृत कर लिया गया कोई भी स्थानीय चर लक्ष्य से बाहर हो जाएगा। बाद के बिंदु पर बंद करने के लिए मजबूर करने से अपरिभाषित व्यवहार होगा, संभवतः ढेर को दूषित कर देगा। इसे ऊपर की ओर फनर्ग समस्या के रूप में जाना जाता है।
चरों को कार्य सौंपना
चर(कंप्यूटर साइंस) को कार्य निर्दिष्ट करना और उन्हें (वैश्विक) डेटा संरचनाएं के अंदर संग्रहीत करने से संभावित रूप से रिटर्निंग कार्य के समान कठिनाइयों से पीड़ित होता है।
f :: [[Integer] -> [Integer]]
f = let a = 3
b = 1
in [map (\x -> a * x + b), map (\x -> b * x + a)]
कार्यों की समानता
जैसा कि कोई समानता के लिए अधिकांश शाब्दिक और उपयोगिता का परीक्षण कर सकता है, यह पूछना स्वाभाविक है कि क्या कोई प्रोग्रामिंग भाषा समानता के लिए परीक्षण कार्यों का समर्थन कर सकती है। आगे के निरीक्षण पर, यह प्रश्न अधिक कठिन प्रतीत होता है और व्यक्ति को कई प्रकार की कार्य समानता के बीच अंतर करना पड़ता है।[7]
- विस्तारात्मक समानता
- दो कार्य f और g को व्यापक रूप से समान माना जाता है यदि वे सभी निविष्ट (∀x. f(x) = g(x)) के लिए अपने उत्पादन पर सहमत होते है। उदाहरण के लिए, समानता की इस परिभाषा के अंतर्गत एक स्थिर प्रकार एल्गोरिथ्म के किसी भी दो कार्यान्वयन, जैसे कि सम्मिलन प्रकार और मर्ज प्रकार, को समान माना जाएगा। विस्तृत समानता पर निर्णय लेना सामान्य रूप से अनिर्णीत समस्या है और यहां तक कि परिमित कार्यक्षेत्र वाले कार्यों के लिए भी अक्सर कठिन होता है। इस कारण से कोई प्रोग्रामिंग भाषा कार्य समानता को विस्तारित समानता के रूप में लागू नहीं करती है।
- गहन समानता
- गहन समानता के अंतर्गत, दो फलन f और g को समान माना जाता है यदि उनकी आंतरिक संरचना समान हो। इस तरह की समानता व्याख्या की गई भाषाओं में कार्य निकायों के स्रोत कोड (जैसे व्याख्या किए गए लिस्प 1.5 में) या संकलित भाषाओं में वस्तु कोड की तुलना करके कार्यान्वित की जा सकती है। गहन समानता का तात्पर्य विस्तारात्मक समानता यह मानते हुए कि कार्य नियतात्मक हैं और उनमें कोई छिपा हुआ निविष्ट नहीं है, जैसे कि कार्यक्रम गणक या एक परिवर्तनशील वैश्विक चर से है।
- संदर्भ समानता
- विस्तारात्मक और गहन समानता को लागू करने की अव्यावहारिकता को देखते हुए, समानता के लिए परीक्षण कार्यों का समर्थन करने वाली अधिकांश भाषाएं संदर्भ समानता का उपयोग करती हैं। सभी कार्यों या समापन को एक अद्वितीय पहचानकर्ता (सामान्यतौर पर कार्य रचना या समापन का पता) निर्दिष्ट किया जाता है और पहचानकर्ता की समानता के आधार पर समानता तय की जाती है। दो अलग-अलग परिभाषित, लेकिन अन्यथा समान कार्य परिभाषाओं को असमान माना जाएगा। संदर्भपरक समानता का तात्पर्य गहन और विस्तारात्मक समानता से है। संदर्भात्मक समानता संदर्भित पारदर्शिता को तोड़ती है और इसलिए हास्केल जैसी शुद्ध भाषाओं में समर्थित नहीं है।
प्रकार सिद्धांत
प्रकार सिद्धांत में, प्रकार A के मानों को स्वीकार करने वाले कार्यों के प्रकार और प्रकार B के मान को वापस करने के लिए A → B या B A के रूप में लिखा जा सकता है। करी-हावर्ड पत्राचार में, प्रकार्य प्रकार तार्किक निहितार्थ से संबंधित हैं; लैम्ब्डा एब्स्ट्रैक्शन काल्पनिक मान्यताओं के निर्वहन से मेल खाता है और कार्य अनुप्रयोग मॉडस पोनेंस अनुमान नियम से मेल खाता है। प्रोग्रामिंग कार्य के सामान्य स्तिथियों के अतिरिक्त, टाइप थ्योरी भी सहयोगी सरणियों और समान डेटा संरचनाओं को प्रतिरूप करने के लिए प्रथम श्रेणी के कार्य का उपयोग करती है।
प्रोग्रामिंग के श्रेणी सिद्धांत गणना में, प्रथम श्रेणी के कार्यों की उपलब्धता बंद श्रेणी की धारणा से मेल खाती है। उदाहरण के लिए, केवल टाइप किया गया लैम्ब्डा कैलकुस कार्टेशियन बंद श्रेणी की आंतरिक भाषा के समान होता है।
भाषा समर्थन
कार्यात्मक प्रोग्रामिंग भाषाएं, जैसे एर्लांग, स्कीम, एमएल, हास्केल, एफ# और स्काला सभी में प्रथम श्रेणी के कार्य हैं। जब शुरुआती कार्यात्मक भाषाओं में से एक लिस्प को डिजाइन किया गया था, तब प्रथम श्रेणी के कार्यों के सभी पहलुओं को ठीक से नहीं समझा गया था, जिसके परिणामस्वरूप कार्यों को गतिशील रूप से लक्षित किया गया था। बाद की स्कीम और सामान्य लिस्प उपभाषाओं में प्रथम श्रेणी के कार्यों को शाब्दिक रूप से लक्षित किया गया था।
पर्ल, पायथन, पीएचपी, लुआ (प्रोग्रामिंग भाषा), टीसीएल / टीके, जावास्क्रिप्ट और आईओ सहित कई स्क्रिप्टिंग भाषाओं में प्रथम श्रेणी के कार्य हैं।
अनिवार्य भाषाओं के लिए, अल्गोल और उसके श्रेणियों जैसे पास्कल, पारंपरिक C श्रेणी और आधुनिक अपशिष्ट-संग्रहित रूपांतर के बीच अंतर करना पड़ता है। अल्गोल श्रेणी ने स्थिर कार्य और उच्च-क्रम लेने वाले कार्य को तर्कों के रूप में अनुमति दी है, लेकिन अल्गोल 68 को छोड़कर उच्च-क्रम वाले कार्य को अनुमति नहीं देता है जो परिणाम के रूप में कार्य लौटाते हैं। इसका कारण यह था कि पहले यह ज्ञात नहीं था कि यदि परिणाम के रूप में एक स्थिर कार्य लौटाया जाता है तो गैर-स्थानीय चर से कैसे समझौता करना है और ऐसी स्तिथियों में एल्गोल 68 रनटाइम त्रुटियाँ पैदा करता है।
C श्रेणी ने तर्कों के रूप में पारित होने वाले कार्यों और उन्हें परिणाम के रूप में वापस करने की अनुमति दी थी लेकिन स्थिर कार्यों का समर्थन न करके किसी भी समस्या से बचाव किया गया था। जीसीसी संकलनकर्ता उन्हें एक विस्तार के रूप में अनुमति देता है। चूंकि रिटर्निंग कार्य की उपयोगिता मुख्य रूप से स्थिर कार्य को वापस करने की क्षमता में निहित है, जो शीर्ष-स्तरीय कार्य के बजाय गैर-स्थानीय चर को अधीन कर लिया है, इन भाषाओं को सामान्यतौर पर पहले प्रथम श्रेणी कार्यों में नहीं माना जाता है।
आधुनिक अनिवार्य भाषाएं अक्सर अपशिष्ट-संग्रह का समर्थन करती हैं जिससे प्रथम श्रेणी के कार्यों का कार्यान्वयन संभव हो जाता है। प्रथम श्रेणी के कार्यों को अक्सर भाषा के बाद के संशोधनों में समर्थित किया गया है, जिसमें C# 2.0 और एप्पल के खंड विस्तार से C, C++ और ऑब्जेक्टिव -C सम्मिलित हैं। C++11 ने अनाम कार्यों और भाषा के बंद होने के लिए समर्थन जोड़ा है, लेकिन भाषा की गैर-अपशिष्ट एकत्र प्रकृति के कारण, परिणाम के रूप में लौटाए जाने वाले कार्यों में गैर-स्थानीय चर के लिए विशेष ध्यान रखना पड़ता है (नीचे देखें) );
भाषा | उच्च-क्रम के कार्य | नेस्टेड फ़ंक्शन | गैर-स्थानीय चर | टिप्पणियाँ | ||||
---|---|---|---|---|---|---|---|---|
बहस | परिणाम | नामांकित | अनाम | बंद | आंशिक आवेदन | |||
अल्गोल परिवार | एल्गोल 60 | हाँ | नहीं | हाँ | नहीं | नीचे की ओर | नहीं | फ़ंक्शन प्रकार हैं । |
एल्गोल 68 | हाँ | हाँ | हाँ | हाँ | नीचे की ओर | नहीं | ||
पास्कल | हाँ | नहीं | हाँ | नहीं | नीचे की ओर | नहीं | ||
एडीए | हाँ | नहीं | हाँ | नहीं | नीचे की ओर | नहीं | ||
ओबेरोन | हाँ | केवल गैर-नेस्टेड | हाँ | नहीं | नीचे की ओर | नहीं | ||
डेल्फी | हाँ | हाँ | हाँ | 2009 | 2009 | नहीं | ||
सी परिवार | सी | हाँ | हाँ | हाँ जीएनयू सी में | हाँ क्लैंग में ( ब्लॉक ) | हाँ क्लैंग में ( ब्लॉक ) | नहीं | फ़ंक्शन पॉइंटर्स हैं । |
सी++ | हाँ | हाँ | सी++11 | सी++11 | सी++11 | सी++11 | इसमें फ़ंक्शन पॉइंटर्स, फ़ंक्शन ऑब्जेक्ट हैं । (इसके अलावा, नीचे देखें।)
के साथ स्पष्ट आंशिक अनुप्रयोग संभव है | |
सी# | हाँ | हाँ | 7 | 2.0/3.0 | 2.0 | 3.0 | इसमें डेलीगेट्स (2.0) और लैम्ब्डा एक्सप्रेशन (3.0) हैं। | |
उद्देश्य सी | हाँ | हाँ | अनाम का उपयोग करना | 2.0 + ब्लॉक | 2.0 + ब्लॉक | नहीं | फ़ंक्शन पॉइंटर्स हैं. | |
जावा | हाँ | हाँ | अनाम का उपयोग करना | जावा 8 | जावा 8 | हाँ | अनाम आंतरिक कक्षाएं हैं । | |
जाना | हाँ | हाँ | अनाम का उपयोग करना | हाँ | हाँ | हाँ | ||
लीम्बो | हाँ | हाँ | हाँ | हाँ | हाँ | नहीं | ||
न्यूज़वीक | हाँ | हाँ | हाँ | हाँ | हाँ | नहीं | ||
जंग | हाँ | हाँ | हाँ | हाँ | हाँ | हाँ | ||
कार्यात्मक भाषाएँ | तुतलाना | वाक्य - विन्यास | वाक्य - विन्यास | हाँ | हाँ | सामान्य लिस्प | नहीं | (नीचे देखें) |
योजना | हाँ | हाँ | हाँ | हाँ | हाँ | एसआरएफआई 26 | ||
जूलिया | हाँ | हाँ | हाँ | हाँ | हाँ | हाँ | ||
क्लोजर | हाँ | हाँ | हाँ | हाँ | हाँ | हाँ | ||
एमएल | हाँ | हाँ | हाँ | हाँ | हाँ | हाँ | ||
हास्केल | हाँ | हाँ | हाँ | हाँ | हाँ | हाँ | ||
jq | हाँ | नहीं | हाँ | केवल अभिव्यक्तियाँ | नीचे की ओर | नहीं | ||
स्काला | हाँ | हाँ | हाँ | हाँ | हाँ | हाँ | ||
Erlang | हाँ | हाँ | हाँ | हाँ | हाँ | हाँ | ||
एफ# | हाँ | हाँ | हाँ | हाँ | हाँ | हाँ | ||
ओकैमल | हाँ | हाँ | हाँ | हाँ | हाँ | हाँ | ||
स्क्रिप्टिंग भाषाएँ | आईओ | हाँ | हाँ | हाँ | हाँ | हाँ | नहीं | |
जावास्क्रिप्ट | हाँ | हाँ | हाँ | हाँ | हाँ | ईसीएमएस्क्रिप्ट 5 | ES3 पर उपयोगकर्ता-भूमि कोड के साथ आंशिक आवेदन संभव है | |
लुआ | हाँ | हाँ | हाँ | हाँ | हाँ | हाँ | ||
पीएचपी | हाँ | हाँ | अनाम का उपयोग करना | 5.3 | 5.3 | नहीं | उपयोगकर्ता-भूमि कोड के साथ आंशिक आवेदन संभव है। | |
पर्ल | हाँ | हाँ | 6 | हाँ | हाँ | 6 | ||
अजगर | हाँ | हाँ | हाँ | केवल अभिव्यक्तियाँ | हाँ | 2.5 | (नीचे देखें) | |
माणिक | वाक्य - विन्यास | वाक्य - विन्यास | अनस्कोप्ड | हाँ | हाँ | 1.9 | (नीचे देखें) | |
अन्य भाषाएं | फोरट्रान | हाँ | हाँ | हाँ | नहीं | नहीं | नहीं | |
मेपल | हाँ | हाँ | हाँ | हाँ | हाँ | नहीं | ||
मेथेमेटिका | हाँ | हाँ | हाँ | हाँ | हाँ | नहीं | ||
मतलब | हाँ | हाँ | हाँ | हाँ | हाँ | हाँ | नए कार्यों की स्वचालित पीढ़ी द्वारा आंशिक अनुप्रयोग संभव। | |
गपशप | हाँ | हाँ | हाँ | हाँ | हाँ | आंशिक | पुस्तकालय के माध्यम से आंशिक आवेदन संभव। | |
तीव्र | हाँ | हाँ | हाँ | हाँ | हाँ | हाँ |
- सी ++
- सी ++ 11 समापन गैर-स्थानीय चर को प्रतिलिपि निर्माण, संदर्भ द्वारा (उनके जीवनकाल को बढ़ाए बिना), या स्थानांतरित निर्माण द्वारा (वेरिएबल तब तक रहता है जब तक समापन रहता है) अधीन कर सकता है। यदि समापन लौटाया जाता है तो पहला विकल्प सुरक्षित है लेकिन एक प्रतिलिपि की आवश्यकता होती है और इसका उपयोग मूल चर को संशोधित करने के लिए नहीं किया जा सकता है जो समापन कहे जाने के समय उपलब्ध नहीं हो सकता है। दूसरा विकल्प संभावित रूप से एक महंगी प्रतिलिपि से बचता है और मूल चर को संशोधित करने की अनुमति देता है लेकिन बंद होने की स्थिति में असुरक्षित है। तीसरा विकल्प सुरक्षित है अगर समापन लौटाया जाता है और प्रतिलिपि की आवश्यकता नहीं होती है लेकिन मूल चर को संशोधित करने के लिए भी इसका उपयोग नहीं किया जा सकता है।
- जावा
- जावा 8 समापन केवल अंतिम या प्रभावी रूप से अंतिम गैर-स्थानीय चर को अधीन कर सकते हैं। अनाम कार्य संदर्भ से अनुमानित प्रकार लेते हैं और जावा के कार्य प्रकारों को श्रेणियों के रूप में दर्शाया जाता है। विधि संदर्भ सीमित हैं।
- लिस्प
- लेक्सिकली लक्षित लिस्प रूपांतर समापन का समर्थन करता है। गतिशील रूप से लक्षित किए गए रूपांतर समापन का समर्थन नहीं करते हैं या समापन बनाने के लिए एक विशेष निर्माण की आवश्यकता होती है।[8]
- सामान्य लिस्प में, कार्य नेमस्पेस में कार्य के पहचानकर्ता को प्रथम श्रेणी के मान के संदर्भ के रूप में उपयोग नहीं किया जा सकता है।
function
कार्य को मान के रूप में पुनर्प्राप्त करने के लिए विशेष संचालिका का उपयोग किया जाना चाहिए:(function foo)
एक कार्य वस्तु का मूल्यांकन करता है।#'foo
आशुलिपि संकेतन के रूप में उपलब्ध है। इस तरह के कार्य वस्तु को लागू करने के लिए,funcall
कार्य(funcall #'foo bar baz)
का उपयोग करना चाहिए। - पाइथन
functools.partial
संस्करण 2.5 से औरoperator.methodcaller
संस्करण 2.6 से स्पष्ट आंशिक अनुप्रयोग।- रूबी
- रूबी (जो वास्तव में एक विधि है) में नियमित कार्य के पहचानकर्ता को मान के रूप में उपयोग या पारित नहीं किया जा सकता है। प्रथम श्रेणी डेटा के रूप में उपयोग करने के लिए इसे पहले किसी
Method
याProc
वस्तु में पुनर्प्राप्त किया जाना चाहिए। स्पष्ट रूप से स्थिर विधि परिभाषाएँ वास्तव में लक्ष्य को स्थिर नहीं करती हैं, ऐसे कार्य वस्तु को कॉल करने की संरचना अन्य नियमित तरीकों को कॉल करने से भिन्न होती है।[1]
.
यह भी देखें
- निष्क्रियता
- eval
- प्रथम श्रेणी का संदेश
- कप्पा कलन - एक औपचारिकता जो प्रथम श्रेणी के कार्यों को बाहर करती है
- आदमी या लड़का परीक्षण
- आंशिक आवेदन
टिप्पणियाँ
- ↑ Abelson, Harold; Sussman, Gerald Jay (1984). कंप्यूटर प्रोग्राम की संरचना और व्याख्या. MIT Press. Formulating Abstractions with Higher-Order Procedures. ISBN 0-262-01077-1.
- ↑ Programming language pragmatics, by Michael Lee Scott, section 11.2 "Functional Programming".
- ↑ Roberto Ierusalimschy; Luiz Henrique de Figueiredo; Waldemar Celes (2005). "The Implementation of Lua 5.0". Journal of Universal Computer Science. 11 (7): 1159–1176. doi:10.3217/jucs-011-07-1159.
- ↑ 4.0 4.1 Burstall, Rod; Strachey, Christopher (2000). "प्रोग्रामिंग भाषाओं को समझना" (PDF). Higher-Order and Symbolic Computation. 13 (52): 11–49. doi:10.1023/A:1010052305354. S2CID 1989590. Archived from the original on February 16, 2010.
{{cite journal}}
: CS1 maint: bot: original URL status unknown (link) (also on 2010-02-16 - ↑ Joel Moses. "The Function of FUNCTION in LISP, or Why the FUNARG Problem Should be Called the Environment Problem". MIT AI Memo 199, 1970.
- ↑ "If you try to call the nested function through its address after the containing function has exited, all hell will break loose." (GNU Compiler Collection: Nested Functions)
- ↑ Andrew W. Appel (1995). "Intensional Equality ;=) for Continuations".
- ↑ Closures in ZetaLisp Archived 2012-03-19 at the Wayback Machine
संदर्भ
- Leonidas Fegaras. "Functional Languages and Higher-Order Functions". CSE5317/CSE4305: Design and Construction of Compilers. University of Texas at Arlington.