यह मेरे पिछले प्रश्न के उत्तर का अनुगमन है ।
मैं प्रत्येक आइटम मैप करने की आवश्यकता मान लीजिए 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।
क्या इस का कोई मतलब निकलता है ?