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