Ini merupakan tindak lanjut dari jawaban atas pertanyaan saya sebelumnya.
Misalkan saya perlu untuk memetakan setiap item a:Adari List[A]untuk b:Bdengan fungsi def f(a:A, leftNeighbors:List[A]): Bdan menghasilkan List[B].
Jelas saya tidak bisa begitu saja memanggil mapdaftar tetapi saya bisa menggunakan daftar ritsleting . Ritsleting adalah kursor untuk bergerak di sekitar daftar. Ini menyediakan akses ke elemen saat ini ( focus) dan tetangganya.
Sekarang saya bisa mengganti fdengan saya def f'(z:Zipper[A]):B = f(z.focus, z.left)dan meneruskan fungsi baru ini f'ke cobindmetode Zipper[A].
Cara cobindkerjanya seperti ini: ia menyebutnya f'dengan ritsleting, lalu memindahkan ritsleting, memanggil f'dengan ritsleting baru yang "dipindahkan", memindahkan ritsleting lagi dan seterusnya, dan seterusnya ... hingga ritsleting mencapai akhir daftar.
Akhirnya, cobindmengembalikan jenis ritsleting baru Zipper[B], yang dapat diubah ke daftar dan masalah terpecahkan.
Sekarang perhatikan simetri antara cobind[A](f:Zipper[A] => B):Zipper[B]dan bind[A](f:A => List[B]):List[B]Itu sebabnya Listadalah a Monaddan Zipperadalah a Comonad.
Apakah masuk akal ?