এটি উত্তরের একটি ফলোআপ আমার আগের প্রশ্নের ।
আমি প্রতিটি আইটেমের ম্যাপ প্রয়োজন ধরুন 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এটি একটি Monadএবং Zipperএকটি Comonad।
এটা বোঝা যায় না?