समझ में क्यों Zipper एक Comonad है


112

यह मेरे पिछले प्रश्न के उत्तर का अनुगमन है ।

मैं प्रत्येक आइटम मैप करने की आवश्यकता मान लीजिए a:Aकी List[A]करने के लिए b:Bसमारोह के साथ def f(a:A, leftNeighbors:List[A]): Bऔर उत्पन्न List[B]

जाहिर है मैं सिर्फ mapसूची पर कॉल नहीं कर सकता लेकिन मैं सूची ज़िप का उपयोग कर सकता हूं । जिपर एक सूची के चारों ओर जाने के लिए एक कर्सर है। यह वर्तमान तत्व ( focus) और उसके पड़ोसियों तक पहुंच प्रदान करता है।

अब मैं अपने जगह ले सकता है fके साथ def f'(z:Zipper[A]):B = f(z.focus, z.left)है और इस नए कार्य को पारित f'करने के लिए cobindकी विधि Zipper[A]

इस cobindतरह से काम करता है: यह कहता है कि f'जिपर के साथ, फिर जिपर को स्थानांतरित करता f'है, नए "स्थानांतरित" जिपर के साथ कॉल करता है , जिपर को फिर से और इसी तरह आगे बढ़ाता है, और जब तक ... जिपर सूची के अंत तक नहीं पहुंचता।

अंत में, cobindरिटर्न का नया जिपर प्रकार का होता है Zipper[B], जिसे सूची में बदला जा सकता है और इसलिए समस्या हल हो जाती है।

अब समरूपता पर ध्यान दें cobind[A](f:Zipper[A] => B):Zipper[B]और bind[A](f:A => List[B]):List[B]इसीलिए Lista Monadऔर Zippera है Comonad

क्या इस का कोई मतलब निकलता है ?


1
मैं एक विशेषज्ञ नहीं हूं, लेकिन यह मेरे लिए समझ में आता है। आपकी व्याख्या पढ़ते हुए मुझे एक प्रसंग आया। धन्यवाद!
०१:११ बजे ०१

7
आपके प्रश्न का SO प्रारूप में उत्तर देना बहुत कठिन है ... लेकिन आप बिल्कुल सही हैं। तत्व केंद्रित जिपर हमेशा कॉमनोड होते हैं।
जे। अब्राम्सन

4
सूची को कोमोनॉड के रूप में अच्छी तरह से (कई मायनों में) देखा जा सकता है, जबकि एक जिपर को एक मोनड (कई मायनों में भी) के रूप में डाला जा सकता है। अंतर यह है कि क्या आप एक स्टेट मशीन पर रचनात्मक रूप से "एप्लाइड" डेटा पर ध्यान केंद्रित कर रहे हैं (जो कि मोनाड इंटरफ़ेस के बारे में है), या इसे "डीकोस्ट्रिक्टली" से "स्टेटिंग" करना है (जो कोमोनड करता है)। हालाँकि, इस प्रश्न का उत्तर देना आसान नहीं है, क्योंकि "यह समझ में आता है", हालांकि। कुछ अर्थों में यह करता है, दूसरे में यह नहीं है।
केटी।

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

2
@eenblam तुम सही हो। मैं एक उत्तर जोड़ूंगा और इस प्रश्न को अनुत्तरित सूची से हटा दूंगा, मुझे आशा है
माइकल

जवाबों:


1

जैसा कि यह सवाल "अनुत्तरित" सूची के शीर्ष पर नियमित रूप से पॉपिंग है, मुझे बस अपनी टिप्पणी को यहां एक उत्तर के रूप में कॉपी करना है - वैसे भी एक वर्ष पहले के मुकाबले कुछ भी अधिक रचनात्मक दिखाई नहीं दिया है।

A Listको केवल कॉमनड (कई मायनों में) के Zipperरूप में देखा जा सकता है , जबकि एक मोनाड (कई मायनों में भी) के रूप में डाला जा सकता है। अंतर यह है कि क्या आप एक राज्य मशीन (जो कि Monadइंटरफ़ेस के बारे में है) को रचनात्मक रूप से "एप्लाइड" डेटा पर केंद्रित कर रहे हैं , या इसे "डीकोस्ट्रक्टिवली" से "राज्य" निकाल रहे हैं (यह वही Comonadकरता है)।

हालाँकि, इस प्रश्न का उत्तर देना आसान नहीं है, क्योंकि "यह समझ में आता है", हालांकि। कुछ अर्थों में यह करता है, दूसरे में यह नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.