Це продовження відповіді на моє попереднє запитання.
Припустимо , що мені потрібно відобразити кожен елемент 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.
Чи є сенс?