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