कैटामोर्फिज्म: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
 
(7 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{confuse|Anamorphism}}
{{confuse|एनामोर्फिज्म}}
[[श्रेणी सिद्धांत]] में, कैटामोर्फिज्म की अवधारणा (प्राचीन ग्रीक से: {{wikt-lang|grc|κατά}} नीचे की ओर और {{wikt-lang|grc|μορφή}} रूप, आकार ) [[प्रारंभिक बीजगणित]] से किसी अन्य बीजगणित में अद्वितीय [[समरूपता]] को दर्शाता है।
[[श्रेणी सिद्धांत]] में, '''कैटामोर्फिज्म''' की अवधारणा (प्राचीन ग्रीक से: {{wikt-lang|grc|κατά}} नीचे की ओर और {{wikt-lang|grc|μορφή}} रूप, आकार ) [[प्रारंभिक बीजगणित]] से किसी अन्य बीजगणित में अद्वितीय [[समरूपता]] को दर्शाता है।


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


== परिभाषा ==
== परिभाषा ==
प्रारंभिक बीजगणित एफ-बीजगणित पर विचार करें|<math>F</math>-बीजगणित <math>(A, in)</math> कुछ [[ एंडोफन्क्टर |एंडोफन्क्टर]] के लिए <math>F</math> अपने आप में कुछ [[श्रेणी (गणित)]] की। यहाँ <math>in</math> से रूपवाद है <math>FA</math> को <math>A</math>. चूंकि यह प्रारंभिक है, हम जानते हैं कि जब भी <math>(X, f)</math> दूसरा है <math>F</math>-बीजगणित, यानी रूपवाद <math>f</math> से <math>FX</math> को <math>X</math>, अद्वितीय समरूपता है <math>h</math> से <math>(A, in)</math> को <math>(X, f)</math>. की श्रेणी की परिभाषा के अनुसार <math>F</math>-बीजगणित, यह <math>h</math> से रूपवाद से मेल खाता है <math>A</math> को <math>X</math>, परंपरागत रूप से भी निरूपित किया जाता है <math>h</math>, ऐसा है कि <math>h \circ in = f \circ Fh</math>. के सन्दर्भ में <math>F</math>-बीजगणित, प्रारंभिक वस्तु से विशिष्ट रूप से निर्दिष्ट रूपवाद को निरूपित किया जाता है <math>\mathrm{cata}\ f</math> और इसलिए निम्नलिखित संबंध की विशेषता है:
इस प्रकार अपने आप में कुछ श्रेणी के कुछ एंडोफंक्टर एफ के लिए प्रारंभिक <math>F</math>-बीजगणित <math>(A, in)</math> पर विचार करें। यहां <math>F</math> से <math>A</math> तक मोर्फिस्म है। चूंकि यह <math>in</math> प्रारंभिक है, हम जानते हैं कि जब भी <math>(X, f)</math> और <math>FA</math>-बीजगणित है, अर्थात <math>FX</math> से <math>f</math> तक मोर्फिस्म <math>X</math> है, तो वहां एक मोर्फिस्म है अद्वितीय समरूपता <math>h</math> से <math>(A, in)</math> से <math>(X, f)</math> तक <math>F</math>-बीजगणित की श्रेणी की परिभाषा के अनुसार, यह <math>h</math> <math>A</math> से <math>X</math> तक मोर्फिस्म से मेल खाता है, जिसे परंपरागत रूप से <math>h</math> भी दर्शाया जाता है, जैसे कि <math>h \circ in = f \circ Fh</math> <math>F</math>-बीजगणित के संदर्भ में, प्रारंभिक वस्तु से विशिष्ट रूप से निर्दिष्ट मोर्फिस्म को <math>\mathrm{cata}\ f</math> द्वारा दर्शाया जाता है और इसलिए निम्नलिखित संबंध द्वारा विशेषता दी जाती है:


*<math>h = \mathrm{cata}\ f</math>
*<math>h = \mathrm{cata}\ f</math>
*<math>h \circ in = f \circ Fh</math>
*<math>h \circ in = f \circ Fh</math>
== शब्दावली और इतिहास ==
== शब्दावली और इतिहास ==
साहित्य में पाया जाने वाला और संकेतन है <math>(\!|f|\!)</math>. उपयोग किए गए खुले ब्रैकेट को केला ब्रैकेट के रूप में जाना जाता है, जिसके बाद कैटामोर्फिज्म को कभी-कभी ''केला'' कहा जाता है, जैसा कि [[एरिक मीजर (कंप्यूटर वैज्ञानिक)]] ''एट अल'' में बताया गया है।<ref name="Meijer et al">{{Citation|last1=Meijer|first1=Erik|title=Functional programming with bananas, lenses, envelopes and barbed wire|date=1991|url=http://link.springer.com/10.1007/3540543961_7|work=Functional Programming Languages and Computer Architecture|volume=523|pages=124–144|editor-last=Hughes|editor-first=John|publisher=Springer Berlin Heidelberg|language=en|doi=10.1007/3540543961_7|isbn=978-3-540-54396-1|access-date=2020-05-07|last2=Fokkinga|first2=Maarten|last3=Paterson|first3=Ross|s2cid=11666139 }}</ref> प्रोग्रामिंग के संदर्भ में कैटामोर्फिज्म की धारणा को पेश करने वाले पहले प्रकाशनों में से एरिक मीजर (कंप्यूटर वैज्ञानिक) एट अल द्वारा लिखा गया पेपर "केले, लेंस, लिफाफे और कांटेदार तार के साथ कार्यात्मक प्रोग्रामिंग" था।<ref name="Meijer et al" />जो [[स्क्विगोल]] औपचारिकता के संदर्भ में था।
साहित्य में पाया जाने वाला एक अन्य नोटेशन <math>(\!|f|\!)</math> है। उपयोग किए गए विवृत ब्रैकेट को केले ब्रैकेट के रूप में जाना जाता है, जिसके पश्चात् कैटामोर्फिज्म को कभी-कभी ''बनाना'' कहा जाता है, जैसा कि [[एरिक मीजर (कंप्यूटर वैज्ञानिक)]] ''एट अल'' में बताया गया है।<ref name="Meijer et al">{{Citation|last1=Meijer|first1=Erik|title=Functional programming with bananas, lenses, envelopes and barbed wire|date=1991|url=http://link.springer.com/10.1007/3540543961_7|work=Functional Programming Languages and Computer Architecture|volume=523|pages=124–144|editor-last=Hughes|editor-first=John|publisher=Springer Berlin Heidelberg|language=en|doi=10.1007/3540543961_7|isbn=978-3-540-54396-1|access-date=2020-05-07|last2=Fokkinga|first2=Maarten|last3=Paterson|first3=Ross|s2cid=11666139 }}</ref> प्रोग्रामिंग के संदर्भ में कैटामोर्फिज्म की धारणा को प्रस्तुत करने वाले पहले प्रकाशनों में से एरिक मीजर (कंप्यूटर वैज्ञानिक) एट अल द्वारा लिखा गया पेपर "केले, लेंस, एन्वोलाप और बार्बेड तार के साथ फंक्शनल प्रोग्रामिंग" था।<ref name="Meijer et al" /> जो [[स्क्विगोल]] औपचारिकता के संदर्भ में था। सामान्य श्रेणीबद्ध परिभाषा [[ग्रांट मैल्कम]] द्वारा दी गई थी। <ref>{{Citation |last=Malcolm |first=Grant Reynold |year=1990 |title=Algebraic Data Types and Program Transformation |url=http://cgi.csc.liv.ac.uk/~grant/PS/thesis.pdf |type=Ph.D. Thesis |publisher=University of Groningen |url-status=dead |archive-url=https://web.archive.org/web/20150610231842/http://cgi.csc.liv.ac.uk/~grant/PS/thesis.pdf |archive-date=2015-06-10 }}.</ref><ref>{{Citation |last=Malcolm |first=Grant |year=1990 |title=Data structures and program transformation |periodical=Science of Computer Programming |volume=14 |issue=2–3 |pages=255–279 |doi=10.1016/0167-6423(90)90023-7|doi-access=free }}.</ref>
सामान्य श्रेणीबद्ध परिभाषा [[ग्रांट मैल्कम]] द्वारा दी गई थी।
<ref>{{Citation |last=Malcolm |first=Grant Reynold |year=1990 |title=Algebraic Data Types and Program Transformation |url=http://cgi.csc.liv.ac.uk/~grant/PS/thesis.pdf |type=Ph.D. Thesis |publisher=University of Groningen |url-status=dead |archive-url=https://web.archive.org/web/20150610231842/http://cgi.csc.liv.ac.uk/~grant/PS/thesis.pdf |archive-date=2015-06-10 }}.</ref><ref>{{Citation |last=Malcolm |first=Grant |year=1990 |title=Data structures and program transformation |periodical=Science of Computer Programming |volume=14 |issue=2–3 |pages=255–279 |doi=10.1016/0167-6423(90)90023-7|doi-access=free }}.</ref>
 


== उदाहरण ==
== उदाहरण ==
हम उदाहरणों की श्रृंखला देते हैं, और फिर [[हास्केल (प्रोग्रामिंग भाषा)]] प्रोग्रामिंग भाषा में कैटामोर्फिज्म के लिए अधिक वैश्विक दृष्टिकोण देते हैं।
हम उदाहरणों की श्रृंखला देते हैं, और फिर [[हास्केल (प्रोग्रामिंग भाषा)|हास्केल (प्रोग्रामिंग लैंग्वेज)]] प्रोग्रामिंग लैंग्वेज में कैटामोर्फिज्म के लिए अधिक वैश्विक दृष्टिकोण देते हैं।


===पुनरावृत्ति ===
===पुनरावृत्ति ===
पुनरावृत्ति-चरणीय नुस्खे प्रारंभिक वस्तु के रूप में प्राकृतिक संख्याओं की ओर ले जाते हैं।
पुनरावृत्ति-चरणीय विधि प्रारंभिक वस्तु के रूप में प्राकृतिक संख्याओं की ओर ले जाते हैं।


फ़नकार पर विचार करें <code>fmaybe</code> डेटा प्रकार को मैप करना <code>b</code> डेटा प्रकार के लिए <code>fmaybe b</code>, जिसमें प्रत्येक पद की प्रति शामिल है <code>b</code> साथ ही अतिरिक्त पद <code>Nothing</code> (हास्केल में, यही है <code>Maybe</code> करता है)। इसे टर्म और फ़ंक्शन का उपयोग करके एन्कोड किया जा सकता है। तो मान लीजिए कि स्टेपअलजेब्रा के उदाहरण में फ़ंक्शन भी शामिल है <code>fmaybe b</code> को <code>b</code>, जो मानचित्र करता है <code>Nothing</code> निश्चित अवधि के लिए <code>nil</code> का <code>b</code>, और जहां कॉपी की गई शर्तों पर कार्रवाई की जाएगी <code>next</code>.
फ़ंक्टर <code>fmaybe</code> को डेटा प्रकार b को डेटा प्रकार <code>fmaybe b</code> पर माप करने पर विचार करें जिसमें <code>b</code> से प्रत्येक शब्द की प्रति के साथ-साथ एक अतिरिक्त शब्द <code>Nothing</code> भी सम्मिलित है (हास्केल में, <code>Maybe</code> यही करता है)। इसे टर्म और एक फ़ंक्शन का उपयोग करके एन्कोड किया जा सकता है। तो चलिए स्टेपएल्जेब्रा के उदाहरण में <code>fmaybe b</code> से <code>b</code> तक फ़ंक्शन भी सम्मिलित है जो कुछ भी <code>Nothing</code> नहीं को <code>b</code> के निश्चित पद <code>nil</code> पर माप करता है और जहां कॉपी किए गए शब्दों पर कार्य को <code>next</code> कहा जाता है।


<syntaxhighlight lang="haskell">
<syntaxhighlight lang="haskell">
Line 35: Line 31:
foldSteps (nil, next) (Succ nat) = next $ foldSteps (nil, next) nat
foldSteps (nil, next) (Succ nat) = next $ foldSteps (nil, next) nat
</syntaxhighlight>
</syntaxhighlight>
एक मूर्खतापूर्ण उदाहरण के रूप में, एन्कोडेड स्ट्रिंग्स पर बीजगणित पर विचार करें <code>("go!", \s -> "wait.. " ++ s)</code>, जिसके लिए <code>Nothing</code> को मैप किया गया है <code>"go!"</code> और अन्यथा <code>"wait.. "</code> पूर्वनिर्मित है. जैसा <code>(Succ . Succ . Succ . Succ $ Zero)</code> में संख्या चार को दर्शाता है <code>Nat</code>, निम्नलिखित प्रतीक्षा करने का मूल्यांकन करेगा.. रुको.. रुको.. रुको.. जाओ! : <syntaxhighlight lang="haskell" inline>foldSteps ("go!", \s -> "wait.. " ++ s) (Succ . Succ . Succ . Succ $ Zero)</syntaxhighlight>. हम आसानी से कोड को अधिक उपयोगी ऑपरेशन में बदल सकते हैं, जैसे कि संख्याओं पर बीजगणितीय ऑपरेशन का बार-बार संचालन, केवल एफ-बीजगणित को बदलकर। <code>(nil, next)</code>, जिसे पारित कर दिया गया है <code>foldSteps</code>


=== सूची तह ===
एक सामान्य उदाहरण के रूप में, <code>("go!", \s -> "wait.. " ++ s)</code> के रूप में एन्कोडेड स्ट्रिंग्स पर बीजगणित पर विचार करें, जिसके लिए <code>Nothing</code> <code>"go!"</code> के रूप में माप किया गया है। और अन्यथा <code>"wait.. "</code> पहले से जोड़ा गया है। जैसा कि <code>(Succ . Succ . Succ . Succ $ Zero)</code> <code>Nat</code> में नंबर चार को दर्शाता है, निम्नलिखित का मूल्यांकन <syntaxhighlight lang="haskell" inline="">foldSteps ("go!", \s -> "wait.. " ++ s) (Succ . Succ . Succ . Succ $ Zero)</syntaxhighlight>। हम सरलता से कोड को अधिक उपयोगी ऑपरेशन में परिवर्तित कर सकते हैं, जैसे संख्याओं पर बीजगणितीय ऑपरेशन का अधिकांशतः संचालन, केवल एफ-बीजगणित <code>(nil, next)</code> को परिवर्तित करके, जिसे <code>foldSteps</code> में पास किया जाता है
एक निश्चित प्रकार के लिए <code>a</code>, फ़ंक्टर मैपिंग प्रकारों पर विचार करें <code>b</code> उन दो प्रकारों के उत्पाद प्रकार के लिए। इसके अलावा हम शब्द भी जोड़ते हैं <code>Nil</code> इस परिणामी प्रकार के लिए. एफ-बीजगणित अब मानचित्र करेगा <code>Nil</code> किसी विशेष शब्द के लिए <code>nil</code> का <code>b</code> या किसी युग्म (निर्मित प्रकार का कोई अन्य पद) को पद में मिला दें <code>b</code>. जोड़ी के इस विलय को प्रकार के फ़ंक्शन के रूप में एन्कोड किया जा सकता है <code>a -> b -> b</code>.
=== लिस्ट्स फोल्ड ===
एक निश्चित प्रकार <code>a</code> के लिए, उन दो प्रकारों के प्रोडक्ट प्रकार के लिए फ़ंक्टर मैपिंग प्रकार <code>b</code> पर विचार करें। इसके अतिरिक्त हम इस परिणामी प्रकार में शब्द <code>Nil</code> भी जोड़ते हैं। एफ-बीजगणित अब शून्य को <code>b</code> के कुछ विशेष पद <code>Nil</code> में मैप करेगा या एक जोड़ी (निर्मित एक प्रकार का कोई अन्य शब्द) को <code>b</code> के पद में "मर्ज" करेगा। जोड़ी के इस विलय को <code>a -> b -> b</code>. प्रकार के फ़ंक्शन के रूप में एन्कोड किया जा सकता है।


<syntaxhighlight lang="haskell">
<syntaxhighlight lang="haskell">
Line 50: Line 45:
foldrList (nil, merge) (Cons x xs) = merge x $ foldrList (nil, merge) xs
foldrList (nil, merge) (Cons x xs) = merge x $ foldrList (nil, merge) xs
</syntaxhighlight>
</syntaxhighlight>
एक उदाहरण के रूप में, एन्कोड किए गए संख्या प्रकारों पर बीजगणित पर विचार करें <code>(3, \x-> \y-> x*y)</code>, जिसके लिए संख्या से <code>a</code> से संख्या पर कार्य करता है <code>b</code> सादे गुणन द्वारा. फिर निम्नलिखित का मूल्यांकन 3.000.000 होगा: <syntaxhighlight lang="haskell" inline>foldrList (3, \x-> \y-> x*y) (Cons 10 $ Cons 100 $ Cons 1000 Nil)</syntaxhighlight>


=== पेड़ की तह ===
उदाहरण के तौर पर, <code>(3, \x-> \y-> x*y)</code> के रूप में एन्कोड किए गए संख्या प्रकारों पर बीजगणित पर विचार करें, जिसके लिए <code>a</code> से संख्या सादे गुणन द्वारा b से संख्या पर कार्य करती है। फिर निम्नलिखित 3.000.000 का मूल्यांकन करता है: फोल्डरलिस्ट <syntaxhighlight lang="haskell" inline="">foldrList (3, \x-> \y-> x*y) (Cons 10 $ Cons 100 $ Cons 1000 Nil)</syntaxhighlight>
एक निश्चित प्रकार के लिए <code>a</code>, फ़ंक्टर मैपिंग प्रकारों पर विचार करें <code>b</code> प्रकार के लिए जिसमें प्रत्येक पद की प्रति होती है <code>a</code> साथ ही सभी जोड़े <code>b</code>(प्रकार के दो उदाहरणों के उत्पाद प्रकार की शर्तें <code>b</code>). बीजगणित में फ़ंक्शन शामिल होता है <code>b</code>, जो या तो पर कार्य करता है <code>a</code> अवधि या दो <code>b</code> शर्तें। जोड़ी के इस विलय को दो प्रकार के कार्यों के रूप में एन्कोड किया जा सकता है <code>a -> b</code> सम्मान <code>b -> b -> b</code>.
=== ट्री फोल्ड ===
एक निश्चित प्रकार के लिए फंक्टर मैपिंग प्रकार <code>a</code> पर एक ऐसे प्रकार पर विचार करें जिसमें <code>a</code> के प्रत्येक शब्द के साथ-साथ <code>b</code> के सभी जोड़े (प्रकार <code>b</code> के दो उदाहरणों के प्रोडक्ट प्रकार की नियम) की एक प्रति सम्मिलित है। बीजगणित में b का एक फ़ंक्शन होता है जो या तो <code>a</code> पद या दो <code>b</code> पदों पर कार्य करता है। एक जोड़ी के इस विलय को <code>a -> b</code> के संबंध में <code>b -> b -> b</code> प्रकार के दो कार्यों के रूप में एन्कोड किया जा सकता है।


<syntaxhighlight lang="haskell">
<syntaxhighlight lang="haskell">
Line 73: Line 67:
treeSum = (id, (+))
treeSum = (id, (+))
</syntaxhighlight>
</syntaxhighlight>
=== सामान्य स्थिति ===
प्रारंभिक बीजगणित के गहन श्रेणी के सैद्धांतिक अध्ययनों से पता चलता है कि फ़ंक्टर को अपने प्रारंभिक बीजगणित में प्रयुक्त करने से प्राप्त एफ-बीजगणित इसके लिए आइसोमोर्फिक है।


 
सशक्त प्रकार की सिस्टम हमें किसी फ़ंक्टर के प्रारंभिक बीजगणित को एब्स्ट्रेक्ट <code>f</code> रूप से निर्दिष्ट करने में सक्षम बनाती हैं इसका निश्चित बिंदु a = f a है। पुनरावर्ती रूप से परिभाषित कैटामोर्फिज्म को अब एकल पंक्ति में कोडित किया जा सकता है, जहां केस विश्लेषण (जैसे कि ऊपर के विभिन्न उदाहरणों में) को एफएमएपी द्वारा समझाया गया है। चूंकि उत्तरार्द्ध का डोमेन छवि <code>f</code> में ऑब्जेक्ट हैं , कैटामोर्फिज्म का मूल्यांकन <code>a</code> और <code>f a</code> के मध्य में आगे-पीछे होता रहता है .
=== सामान्य मामला ===
प्रारंभिक बीजगणित के गहन श्रेणी के सैद्धांतिक अध्ययनों से पता चलता है कि फ़ंक्टर को अपने प्रारंभिक बीजगणित में लागू करने से प्राप्त एफ-बीजगणित इसके लिए आइसोमोर्फिक है।
 
मजबूत प्रकार की प्रणालियाँ हमें किसी फ़नकार के प्रारंभिक बीजगणित को अमूर्त रूप से निर्दिष्ट करने में सक्षम बनाती हैं <code>f</code> इसका निश्चित बिंदु a = f a है। पुनरावर्ती रूप से परिभाषित कैटामोर्फिज्म को अब एकल पंक्ति में कोडित किया जा सकता है, जहां केस विश्लेषण (जैसे कि ऊपर के विभिन्न उदाहरणों में) को एफएमएपी द्वारा समझाया गया है। चूंकि उत्तरार्द्ध का डोमेन छवि में ऑब्जेक्ट हैं <code>f</code>, कैटामोर्फिज्म का मूल्यांकन बीच में आगे-पीछे होता रहता है <code>a</code> और <code>f a</code>.


<syntaxhighlight lang="haskell">
<syntaxhighlight lang="haskell">
Line 88: Line 80:
cata alg = alg . fmap (cata alg) . invIso -- note that invIso and alg map in opposite directions
cata alg = alg . fmap (cata alg) . invIso -- note that invIso and alg map in opposite directions
</syntaxhighlight>
</syntaxhighlight>
अब फिर से पहला उदाहरण, लेकिन अब फिक्स करने के लिए हो सकता है फ़ैक्टर को पास करके। हो सकता है फ़ैक्टर का बार-बार अनुप्रयोग प्रकारों की श्रृंखला उत्पन्न करता है, जो, हालांकि, निश्चित बिंदु प्रमेय से समरूपता द्वारा एकजुट किया जा सकता है। हम शब्द का परिचय देते हैं <code>zero</code>, जो शायद से उत्पन्न होता है <code>Nothing</code> और बार-बार आवेदन के साथ उत्तराधिकारी फ़ंक्शन की पहचान करें <code>Just</code>. इस प्रकार प्राकृतिक संख्याएँ उत्पन्न होती हैं।
अब फिर से पहला उदाहरण, किन्तु अब फिक्स करने के लिए हो सकता है फ़ैक्टर को पास करके हो सकता है फ़ैक्टर का अधिकांशतः अनुप्रयोग प्रकारों की श्रृंखला उत्पन्न करता है, जो चूँकि, निश्चित बिंदु प्रमेय से समरूपता द्वारा एकत्र किया जा सकता है। हम शब्द का परिचय <code>zero</code> देते हैं , जो संभवतः <code>Nothing</code> से उत्पन्न होता है और अधिकांशतः आवेदन के साथ उत्तराधिकारी फ़ंक्शन <code>Just</code> की पहचान करें . इस प्रकार प्राकृतिक संख्याएँ उत्पन्न होती हैं।


<syntaxhighlight lang="haskell">
<syntaxhighlight lang="haskell">
Line 103: Line 95:
pleaseWait Nothing = "go!"
pleaseWait Nothing = "go!"
</syntaxhighlight>
</syntaxhighlight>
फिर, निम्नलिखित प्रतीक्षा करने का मूल्यांकन करेगा.. रुको.. रुको.. रुको.. जाओ! : <code>cata pleaseWait (successor.successor.successor.successor $ zero)</code>
फिर, निम्नलिखित प्रतीक्षा करने का मूल्यांकन "wait.. wait.. wait.. wait.. go!" करेगा.: <code>cata pleaseWait (successor.successor.successor.successor $ zero)</code>
और अब फिर से पेड़ का उदाहरण. इसके लिए हमें ट्री कंटेनर डेटा प्रकार प्रदान करना होगा ताकि हम इसे सेट कर सकें <code>fmap</code> (हमें इसके लिए ऐसा करने की ज़रूरत नहीं थी <code>Maybe</code> फ़ंक्टर, क्योंकि यह मानक प्रस्तावना का हिस्सा है)
 
और अब फिर से ट्री का उदाहरण इसके लिए हमें ट्री कंटेनर डेटा प्रकार प्रदान करना होगा जिससे हम <code>fmap</code> सेट कर सकें हमें हो सकता है कि फ़ैक्टर <code>Maybe</code> के लिए ऐसा करने की आवश्यक नहीं है क्योंकि यह मानक प्रस्तावना का भाग है)


<syntaxhighlight lang="haskell">
<syntaxhighlight lang="haskell">
Line 127: Line 120:
</syntaxhighlight>
</syntaxhighlight>
निम्नलिखित 4 का मूल्यांकन करेगा: <code>cata treeDepth $ meet (end "X") (meet (meet (end "YXX") (end "YXY")) (end "YY"))</code>
निम्नलिखित 4 का मूल्यांकन करेगा: <code>cata treeDepth $ meet (end "X") (meet (meet (end "YXX") (end "YXY")) (end "YY"))</code>
== यह भी देखें ==
== यह भी देखें ==
*रूपवाद
*मोर्फिस्म
* [[एफ-बीजगणित]] की आकृतियाँ|एफ-बीजगणित
* [[एफ-बीजगणित]] की मोर्फिस्म या एफ-बीजगणित
** कोलजेब्रा से अंतिम कोलजेब्रा तक: एनामोर्फिज्म
** कोलजेब्रा से अंतिम कोलजेब्रा तक: एनामोर्फिज्म
** एक एनामॉर्फिज्म जिसके बाद कैटामॉर्फिज्म आता है: हाइलोमोर्फिज्म (कंप्यूटर विज्ञान)
** एनामॉर्फिज्म जिसके पश्चात् कैटामॉर्फिज्म आता है: हाइलोमोर्फिज्म (कंप्यूटर विज्ञान)
** कैटामोर्फिज्म के विचार का विस्तार: [[परारूपवाद]]
** कैटामोर्फिज्म के विचार का विस्तार: [[परारूपवाद|परामोर्फिस्म]]
** एनामोर्फिज्म के विचार का विस्तार: [[अपोमोर्फिज्म]]
** एनामोर्फिज्म के विचार का विस्तार: [[अपोमोर्फिज्म]]


== संदर्भ ==
== संदर्भ ==
{{reflist|2}}
{{reflist|2}}
 
=== अग्रिम पठन                                                                                                                                               ===
 
 
 
=== अग्रिम पठन ===
{{refbegin}}
{{refbegin}}
* {{cite conference | author1 = Ki Yung Ahn | first2 = Tim | last2 = Sheard | year = 2011 | url = http://dl.acm.org/citation.cfm?id=2034807 | title = A hierarchy of mendler style recursion combinators: taming inductive datatypes with negative occurrences | book-title = Proceedings of the 16th ACM SIGPLAN international conference on Functional programming | conference = ICFP '11 }}
* {{cite conference | author1 = Ki Yung Ahn | first2 = Tim | last2 = Sheard | year = 2011 | url = http://dl.acm.org/citation.cfm?id=2034807 | title = A hierarchy of mendler style recursion combinators: taming inductive datatypes with negative occurrences | book-title = Proceedings of the 16th ACM SIGPLAN international conference on Functional programming | conference = ICFP '11 }}
{{refend}}
{{refend}}
 
== बाहरी संबंध                                                                                                                                                                                                 ==
 
== बाहरी संबंध ==
* [http://www.haskell.org/haskellwiki/Catamorphisms Catamorphisms] at HaskellWiki
* [http://www.haskell.org/haskellwiki/Catamorphisms Catamorphisms] at HaskellWiki
* [https://www.schoolofhaskell.com/user/edwardk/recursion-schemes/catamorphisms Catamorphisms] by Edward Kmett
* [https://www.schoolofhaskell.com/user/edwardk/recursion-schemes/catamorphisms Catamorphisms] by Edward Kmett
* Catamorphisms in [[F Sharp (programming language)|F#]] (Part [http://lorgonblog.wordpress.com/2008/04/05/catamorphisms-part-one/ 1], [http://lorgonblog.wordpress.com/2008/04/06/catamorphisms-part-two/ 2], [http://lorgonblog.wordpress.com/2008/04/09/catamorphisms-part-three/ 3], [http://lorgonblog.wordpress.com/2008/05/24/catamorphisms-part-four/ 4], [http://lorgonblog.wordpress.com/2008/05/31/catamorphisms-part-five/ 5], [http://lorgonblog.wordpress.com/2008/06/02/catamorphisms-part-six/ 6], [http://lorgonblog.wordpress.com/2008/06/07/catamorphisms-part-seven/ 7]) by Brian McNamara
* Catamorphisms in [[F Sharp (programming language)|F#]] (Part [http://lorgonblog.wordpress.com/2008/04/05/catamorphisms-part-one/ 1], [http://lorgonblog.wordpress.com/2008/04/06/catamorphisms-part-two/ 2], [http://lorgonblog.wordpress.com/2008/04/09/catamorphisms-part-three/ 3], [http://lorgonblog.wordpress.com/2008/05/24/catamorphisms-part-four/ 4], [http://lorgonblog.wordpress.com/2008/05/31/catamorphisms-part-five/ 5], [http://lorgonblog.wordpress.com/2008/06/02/catamorphisms-part-six/ 6], [http://lorgonblog.wordpress.com/2008/06/07/catamorphisms-part-seven/ 7]) by Brian McNamara
* [http://ulissesaraujo.wordpress.com/2007/12/19/catamorphisms-in-haskell/ Catamorphisms in Haskell]
* [http://ulissesaraujo.wordpress.com/2007/12/19/catamorphisms-in-haskell/ Catamorphisms in Haskell]
[[Category: श्रेणी सिद्धांत]] [[Category: प्रत्यावर्तन योजनाएँ]] [[Category: कार्यात्मक प्रोग्रामिंग]] [[Category: आकृति विज्ञान]] [[Category: प्रोग्रामिंग में पुनरावृत्ति]]


[[Category: Machine Translated Page]]
[[Category:Articles with hatnote templates targeting a nonexistent page]]
[[Category:CS1 English-language sources (en)]]
[[Category:Created On 24/07/2023]]
[[Category:Created On 24/07/2023]]
[[Category:Machine Translated Page]]
[[Category:Pages with script errors]]
[[Category:Templates Vigyan Ready]]
[[Category:आकृति विज्ञान]]
[[Category:कार्यात्मक प्रोग्रामिंग]]
[[Category:प्रत्यावर्तन योजनाएँ]]
[[Category:प्रोग्रामिंग में पुनरावृत्ति]]
[[Category:श्रेणी सिद्धांत]]

Latest revision as of 11:32, 12 August 2023

श्रेणी सिद्धांत में, कैटामोर्फिज्म की अवधारणा (प्राचीन ग्रीक से: κατά नीचे की ओर और μορφή रूप, आकार ) प्रारंभिक बीजगणित से किसी अन्य बीजगणित में अद्वितीय समरूपता को दर्शाता है।

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

दोहरी अवधारणा एनामोर्फिज्म की है जो सामान्यीकरण को प्रकट करती है। हाइलोमोर्फिज्म (कंप्यूटर विज्ञान) एनामॉर्फिज्म की संरचना है जिसके पश्चात् कैटामॉर्फिज्म आता है।

परिभाषा

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

शब्दावली और इतिहास

साहित्य में पाया जाने वाला एक अन्य नोटेशन है। उपयोग किए गए विवृत ब्रैकेट को केले ब्रैकेट के रूप में जाना जाता है, जिसके पश्चात् कैटामोर्फिज्म को कभी-कभी बनाना कहा जाता है, जैसा कि एरिक मीजर (कंप्यूटर वैज्ञानिक) एट अल में बताया गया है।[1] प्रोग्रामिंग के संदर्भ में कैटामोर्फिज्म की धारणा को प्रस्तुत करने वाले पहले प्रकाशनों में से एरिक मीजर (कंप्यूटर वैज्ञानिक) एट अल द्वारा लिखा गया पेपर "केले, लेंस, एन्वोलाप और बार्बेड तार के साथ फंक्शनल प्रोग्रामिंग" था।[1] जो स्क्विगोल औपचारिकता के संदर्भ में था। सामान्य श्रेणीबद्ध परिभाषा ग्रांट मैल्कम द्वारा दी गई थी। [2][3]

उदाहरण

हम उदाहरणों की श्रृंखला देते हैं, और फिर हास्केल (प्रोग्रामिंग लैंग्वेज) प्रोग्रामिंग लैंग्वेज में कैटामोर्फिज्म के लिए अधिक वैश्विक दृष्टिकोण देते हैं।

पुनरावृत्ति

पुनरावृत्ति-चरणीय विधि प्रारंभिक वस्तु के रूप में प्राकृतिक संख्याओं की ओर ले जाते हैं।

फ़ंक्टर fmaybe को डेटा प्रकार b को डेटा प्रकार fmaybe b पर माप करने पर विचार करें जिसमें b से प्रत्येक शब्द की प्रति के साथ-साथ एक अतिरिक्त शब्द Nothing भी सम्मिलित है (हास्केल में, Maybe यही करता है)। इसे टर्म और एक फ़ंक्शन का उपयोग करके एन्कोड किया जा सकता है। तो चलिए स्टेपएल्जेब्रा के उदाहरण में fmaybe b से b तक फ़ंक्शन भी सम्मिलित है जो कुछ भी Nothing नहीं को b के निश्चित पद nil पर माप करता है और जहां कॉपी किए गए शब्दों पर कार्य को next कहा जाता है।

type StepAlgebra b = (b, b->b) -- the algebras, which we encode as pairs (nil, next)

data Nat = Zero | Succ Nat -- which is the initial algebra for the functor described above

foldSteps :: StepAlgebra b -> (Nat -> b) -- the catamorphisms map from Nat to b
foldSteps (nil, next) Zero       = nil
foldSteps (nil, next) (Succ nat) = next $ foldSteps (nil, next) nat

एक सामान्य उदाहरण के रूप में, ("go!", \s -> "wait.. " ++ s) के रूप में एन्कोडेड स्ट्रिंग्स पर बीजगणित पर विचार करें, जिसके लिए Nothing "go!" के रूप में माप किया गया है। और अन्यथा "wait.. " पहले से जोड़ा गया है। जैसा कि (Succ . Succ . Succ . Succ $ Zero) Nat में नंबर चार को दर्शाता है, निम्नलिखित का मूल्यांकन foldSteps ("go!", \s -> "wait.. " ++ s) (Succ . Succ . Succ . Succ $ Zero)। हम सरलता से कोड को अधिक उपयोगी ऑपरेशन में परिवर्तित कर सकते हैं, जैसे संख्याओं पर बीजगणितीय ऑपरेशन का अधिकांशतः संचालन, केवल एफ-बीजगणित (nil, next) को परिवर्तित करके, जिसे foldSteps में पास किया जाता है

लिस्ट्स फोल्ड

एक निश्चित प्रकार a के लिए, उन दो प्रकारों के प्रोडक्ट प्रकार के लिए फ़ंक्टर मैपिंग प्रकार b पर विचार करें। इसके अतिरिक्त हम इस परिणामी प्रकार में शब्द Nil भी जोड़ते हैं। एफ-बीजगणित अब शून्य को b के कुछ विशेष पद Nil में मैप करेगा या एक जोड़ी (निर्मित एक प्रकार का कोई अन्य शब्द) को b के पद में "मर्ज" करेगा। जोड़ी के इस विलय को a -> b -> b. प्रकार के फ़ंक्शन के रूप में एन्कोड किया जा सकता है।

type ContainerAlgebra a b = (b, a -> b -> b) -- f-algebra encoded as (nil, merge)

data List a = Nil | Cons a (List a) -- which turns out to be the initial algebra

foldrList :: ContainerAlgebra a b -> (List a -> b) -- catamorphisms map from (List a) to b
foldrList (nil, merge) Nil         = nil
foldrList (nil, merge) (Cons x xs) = merge x $ foldrList (nil, merge) xs

उदाहरण के तौर पर, (3, \x-> \y-> x*y) के रूप में एन्कोड किए गए संख्या प्रकारों पर बीजगणित पर विचार करें, जिसके लिए a से संख्या सादे गुणन द्वारा b से संख्या पर कार्य करती है। फिर निम्नलिखित 3.000.000 का मूल्यांकन करता है: फोल्डरलिस्ट foldrList (3, \x-> \y-> x*y) (Cons 10 $ Cons 100 $ Cons 1000 Nil)

ट्री फोल्ड

एक निश्चित प्रकार के लिए फंक्टर मैपिंग प्रकार a पर एक ऐसे प्रकार पर विचार करें जिसमें a के प्रत्येक शब्द के साथ-साथ b के सभी जोड़े (प्रकार b के दो उदाहरणों के प्रोडक्ट प्रकार की नियम) की एक प्रति सम्मिलित है। बीजगणित में b का एक फ़ंक्शन होता है जो या तो a पद या दो b पदों पर कार्य करता है। एक जोड़ी के इस विलय को a -> b के संबंध में b -> b -> b प्रकार के दो कार्यों के रूप में एन्कोड किया जा सकता है।

type TreeAlgebra a b = (a -> b, b -> b -> b) -- the "two cases" function is encoded as (f, g)
 
data Tree a = Leaf a | Branch (Tree a) (Tree a) -- which turns out to be the initial algebra
 
foldTree :: TreeAlgebra a b -> (Tree a -> b) -- catamorphisms map from (Tree a) to b
foldTree (f, g) (Leaf x)            = f x
foldTree (f, g) (Branch left right) = g (foldTree (f, g) left) (foldTree (f, g) right)
treeDepth :: TreeAlgebra a Integer -- an f-algebra to numbers, which works for any input type
treeDepth = (const 1, \i j -> 1 + max i j)
 
treeSum :: (Num a) => TreeAlgebra a a -- an f-algebra, which works  for any number type 
treeSum = (id, (+))

सामान्य स्थिति

प्रारंभिक बीजगणित के गहन श्रेणी के सैद्धांतिक अध्ययनों से पता चलता है कि फ़ंक्टर को अपने प्रारंभिक बीजगणित में प्रयुक्त करने से प्राप्त एफ-बीजगणित इसके लिए आइसोमोर्फिक है।

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

type Algebra f a = f a -> a -- the generic f-algebras

newtype Fix f = Iso { invIso :: f (Fix f) } -- gives us the initial algebra for the functor f

cata :: Functor f => Algebra f a -> (Fix f -> a) -- catamorphism from Fix f to a
cata alg = alg . fmap (cata alg) . invIso -- note that invIso and alg map in opposite directions

अब फिर से पहला उदाहरण, किन्तु अब फिक्स करने के लिए हो सकता है फ़ैक्टर को पास करके हो सकता है फ़ैक्टर का अधिकांशतः अनुप्रयोग प्रकारों की श्रृंखला उत्पन्न करता है, जो चूँकि, निश्चित बिंदु प्रमेय से समरूपता द्वारा एकत्र किया जा सकता है। हम शब्द का परिचय zero देते हैं , जो संभवतः Nothing से उत्पन्न होता है और अधिकांशतः आवेदन के साथ उत्तराधिकारी फ़ंक्शन Just की पहचान करें . इस प्रकार प्राकृतिक संख्याएँ उत्पन्न होती हैं।

type Nat = Fix Maybe
zero :: Nat
zero = Iso Nothing -- every 'Maybe a' has a term Nothing, and Iso maps it into a
successor :: Nat -> Nat
successor = Iso . Just -- Just maps a to 'Maybe a' and Iso maps back to a new term
pleaseWait :: Algebra Maybe String -- again the silly f-algebra example from above
pleaseWait (Just string) = "wait.. " ++ string
pleaseWait Nothing = "go!"

फिर, निम्नलिखित प्रतीक्षा करने का मूल्यांकन "wait.. wait.. wait.. wait.. go!" करेगा.: cata pleaseWait (successor.successor.successor.successor $ zero)

और अब फिर से ट्री का उदाहरण इसके लिए हमें ट्री कंटेनर डेटा प्रकार प्रदान करना होगा जिससे हम fmap सेट कर सकें हमें हो सकता है कि फ़ैक्टर Maybe के लिए ऐसा करने की आवश्यक नहीं है क्योंकि यह मानक प्रस्तावना का भाग है)

data Tcon a b = TconL a | TconR b b
instance Functor (Tcon a) where
    fmap f (TconL x)   = TconL x
    fmap f (TconR y z) = TconR (f y) (f z)
type Tree a = Fix (Tcon a) -- the initial algebra
end :: a -> Tree a
end = Iso . TconL
meet :: Tree a -> Tree a -> Tree a
meet l r = Iso $ TconR l r
treeDepth :: Algebra (Tcon a) Integer -- again, the treeDepth f-algebra example
treeDepth (TconL x)   = 1
treeDepth (TconR y z) = 1 + max y z

निम्नलिखित 4 का मूल्यांकन करेगा: cata treeDepth $ meet (end "X") (meet (meet (end "YXX") (end "YXY")) (end "YY"))

यह भी देखें

  • मोर्फिस्म
  • एफ-बीजगणित की मोर्फिस्म या एफ-बीजगणित
    • कोलजेब्रा से अंतिम कोलजेब्रा तक: एनामोर्फिज्म
    • एनामॉर्फिज्म जिसके पश्चात् कैटामॉर्फिज्म आता है: हाइलोमोर्फिज्म (कंप्यूटर विज्ञान)
    • कैटामोर्फिज्म के विचार का विस्तार: परामोर्फिस्म
    • एनामोर्फिज्म के विचार का विस्तार: अपोमोर्फिज्म

संदर्भ

  1. 1.0 1.1 Meijer, Erik; Fokkinga, Maarten; Paterson, Ross (1991), Hughes, John (ed.), "Functional programming with bananas, lenses, envelopes and barbed wire", Functional Programming Languages and Computer Architecture (in English), Springer Berlin Heidelberg, vol. 523, pp. 124–144, doi:10.1007/3540543961_7, ISBN 978-3-540-54396-1, S2CID 11666139, retrieved 2020-05-07
  2. Malcolm, Grant Reynold (1990), Algebraic Data Types and Program Transformation (PDF) (Ph.D. Thesis), University of Groningen, archived from the original (PDF) on 2015-06-10.
  3. Malcolm, Grant (1990), "Data structures and program transformation", Science of Computer Programming, vol. 14, no. 2–3, pp. 255–279, doi:10.1016/0167-6423(90)90023-7.

अग्रिम पठन

बाहरी संबंध