Este es un seguimiento de la respuesta a mi pregunta anterior.
Supongamos que necesito asignar cada elemento a:Ade List[A]a b:Bcon función def f(a:A, leftNeighbors:List[A]): By generar List[B].
Obviamente, no puedo simplemente llamar mapa la lista, pero puedo usar la cremallera de la lista . La cremallera es un cursor para moverse por una lista. Proporciona acceso al elemento actual ( focus) y sus vecinos.
Ahora puedo reemplazar my fcon def f'(z:Zipper[A]):B = f(z.focus, z.left)y pasar esta nueva función f'al cobindmétodo de Zipper[A].
Las cobindobras de este tipo: llama que f'con el cierre, a continuación, mueve la cremallera, llamadas f'con el nuevo "movidas" de la cremallera, la cremallera se mueve de nuevo y así sucesivamente, y así sucesivamente ... hasta que la cremallera llega al final de la lista.
Finalmente, cobinddevuelve una nueva cremallera de tipo Zipper[B], que se puede transformar a la lista y así se soluciona el problema.
Ahora observe la simetría entre cobind[A](f:Zipper[A] => B):Zipper[B]y. bind[A](f:A => List[B]):List[B]Por eso Listes a Monady Zipperes a Comonad.
Tiene sentido ?
