कैटामोर्फिज्म: Difference between revisions
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
{{confuse| | {{confuse|एनामोर्फिज्म}} | ||
[[श्रेणी सिद्धांत]] में, कैटामोर्फिज्म की अवधारणा (प्राचीन ग्रीक से: {{wikt-lang|grc|κατά}} नीचे की ओर और {{wikt-lang|grc|μορφή}} रूप, आकार ) [[प्रारंभिक बीजगणित]] से किसी अन्य बीजगणित में अद्वितीय [[समरूपता]] को दर्शाता है। | [[श्रेणी सिद्धांत]] में, '''कैटामोर्फिज्म''' की अवधारणा (प्राचीन ग्रीक से: {{wikt-lang|grc|κατά}} नीचे की ओर और {{wikt-lang|grc|μορφή}} रूप, आकार ) [[प्रारंभिक बीजगणित]] से किसी अन्य बीजगणित में अद्वितीय [[समरूपता]] को दर्शाता है। | ||
[[कार्यात्मक प्रोग्रामिंग]] में, कैटामोर्फिज्म | [[कार्यात्मक प्रोग्रामिंग|फंक्शनल प्रोग्रामिंग]] में, कैटामोर्फिज्म अनैतिक विधि से [[बीजगणितीय डेटा प्रकार]] के लिए [[सूची (कंप्यूटिंग)]] के फोल्ड (उच्च-क्रम फ़ंक्शन) का सामान्यीकरण प्रदान करता है, जिसे प्रारंभिक बीजगणित के रूप में वर्णित किया जा सकता है। | ||
दोहरी अवधारणा [[ एनामोर्फिज्म |एनामोर्फिज्म]] की है जो सामान्यीकरण को प्रकट करती है। हाइलोमोर्फिज्म (कंप्यूटर विज्ञान) एनामॉर्फिज्म की संरचना है जिसके | |||
दोहरी अवधारणा [[ एनामोर्फिज्म |एनामोर्फिज्म]] की है जो सामान्यीकरण को प्रकट करती है। हाइलोमोर्फिज्म (कंप्यूटर विज्ञान) एनामॉर्फिज्म की संरचना है जिसके पश्चात् कैटामॉर्फिज्म आता है। | |||
== परिभाषा == | == परिभाषा == | ||
प्रारंभिक | अपने आप में कुछ श्रेणी के कुछ एंडोफंक्टर एफ के लिए प्रारंभिक <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 \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> | ||
Line 13: | Line 14: | ||
== शब्दावली और इतिहास == | == शब्दावली और इतिहास == | ||
साहित्य में पाया जाने वाला | साहित्य में पाया जाने वाला एक अन्य नोटेशन <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> को डेटा प्रकार 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 33: | ||
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>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 48: | ||
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> से संख्या सादे गुणन द्वारा 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>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 75: | Line 75: | ||
=== सामान्य | === सामान्य स्थिति === | ||
प्रारंभिक बीजगणित के गहन श्रेणी के सैद्धांतिक अध्ययनों से पता चलता है कि फ़ंक्टर को अपने प्रारंभिक बीजगणित में | प्रारंभिक बीजगणित के गहन श्रेणी के सैद्धांतिक अध्ययनों से पता चलता है कि फ़ंक्टर को अपने प्रारंभिक बीजगणित में प्रयुक्त करने से प्राप्त एफ-बीजगणित इसके लिए आइसोमोर्फिक है। | ||
सशक्त प्रकार की सिस्टम हमें किसी फ़ंक्टर के प्रारंभिक बीजगणित को एब्स्ट्रेक्ट <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 88: | ||
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> की पहचान करें . इस प्रकार प्राकृतिक संख्याएँ उत्पन्न होती हैं। | ||
<syntaxhighlight lang="haskell"> | <syntaxhighlight lang="haskell"> | ||
Line 103: | Line 103: | ||
pleaseWait Nothing = "go!" | pleaseWait Nothing = "go!" | ||
</syntaxhighlight> | </syntaxhighlight> | ||
फिर, निम्नलिखित प्रतीक्षा करने का मूल्यांकन | फिर, निम्नलिखित प्रतीक्षा करने का मूल्यांकन "wait.. wait.. wait.. wait.. go!" करेगा.: <code>cata pleaseWait (successor.successor.successor.successor $ zero)</code> | ||
और अब फिर से | |||
और अब फिर से ट्री का उदाहरण इसके लिए हमें ट्री कंटेनर डेटा प्रकार प्रदान करना होगा जिससे हम <code>fmap</code> सेट कर सकें हमें हो सकता है कि फ़ैक्टर <code>Maybe</code> के लिए ऐसा करने की आवश्यक नहीं है क्योंकि यह मानक प्रस्तावना का भाग है) | |||
<syntaxhighlight lang="haskell"> | <syntaxhighlight lang="haskell"> | ||
Line 127: | Line 129: | ||
</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> | ||
== यह भी देखें == | == यह भी देखें == | ||
* | *मोर्फिस्म | ||
* [[एफ-बीजगणित]] की | * [[एफ-बीजगणित]] की मोर्फिस्म या एफ-बीजगणित | ||
** कोलजेब्रा से अंतिम कोलजेब्रा तक: एनामोर्फिज्म | ** कोलजेब्रा से अंतिम कोलजेब्रा तक: एनामोर्फिज्म | ||
** | ** एनामॉर्फिज्म जिसके पश्चात् कैटामॉर्फिज्म आता है: हाइलोमोर्फिज्म (कंप्यूटर विज्ञान) | ||
** कैटामोर्फिज्म के विचार का विस्तार: [[परारूपवाद]] | ** कैटामोर्फिज्म के विचार का विस्तार: [[परारूपवाद|परामोर्फिस्म]] | ||
** एनामोर्फिज्म के विचार का विस्तार: [[अपोमोर्फिज्म]] | ** एनामोर्फिज्म के विचार का विस्तार: [[अपोमोर्फिज्म]] | ||
Line 149: | Line 149: | ||
== बाहरी संबंध == | == बाहरी संबंध == | ||
* [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 |
Revision as of 11:06, 5 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.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
- ↑ 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.
- ↑ 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.
अग्रिम पठन
- Ki Yung Ahn; Sheard, Tim (2011). "A hierarchy of mendler style recursion combinators: taming inductive datatypes with negative occurrences". Proceedings of the 16th ACM SIGPLAN international conference on Functional programming. ICFP '11.
बाहरी संबंध
- Catamorphisms at HaskellWiki
- Catamorphisms by Edward Kmett
- Catamorphisms in F# (Part 1, 2, 3, 4, 5, 6, 7) by Brian McNamara
- Catamorphisms in Haskell