Entender por qué Zipper es un Comonad

112

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 ?

Miguel
fuente
1
No soy un experto, pero eso tiene sentido para mí. Tuve una epifanía mientras leía tu explicación. ¡Gracias!
acjay
7
Su pregunta es muy difícil de responder en el formato SO ... pero tiene toda la razón. Las cremalleras centradas en los elementos siempre son comunes.
J. Abrahamson
4
List se puede ver también como un comonad (de múltiples formas), mientras que Zipper se puede lanzar como una mónada (también de muchas formas). La diferencia está en si te enfocas conceptualmente en "agregar" datos de manera constructiva a una máquina de estado (de eso se trata la interfaz Monad), o en "extraer" el estado de ella "deconstructivamente" (eso es lo que hace Comonad). Sin embargo, no es fácil responder a la pregunta, planteada como "¿tiene sentido este entendimiento?". En cierto sentido lo hace, en otro no.
KT.
2
Para convertir algo en un comonad, necesita proporcionar dos operaciones: 1) Extracción de un valor (por ejemplo, podría ser el encabezado de la lista) y 2) Aplicación de una operación de procesamiento de lista (por ejemplo, podría aplicarlo en un deslizamiento- ventana a lo largo de la lista o en forma de elementos o similar, asumiendo que una transformación de unidad apropiada no cambiará la lista). Si tal forma de procesar una lista tiene algún sentido es un tema aparte. Tenga en cuenta que una interfaz común simple no proporciona una forma de construir la lista ni de recorrerla. Solo sabe cómo consumir operaciones con reconocimiento de listas.
KT.
2
@eenblam Tienes razón. Agregaré una respuesta y sacará esta pregunta de la lista sin respuesta, espero
Michael

Respuestas:

1

Como esta pregunta aparece regularmente en la parte superior de la lista de "sin respuesta", permítanme simplemente copiar mi comentario como respuesta aquí; de todos modos, no ha aparecido nada considerablemente más constructivo desde hace un año.

A también Listse puede ver como una comónada (de múltiples formas), mientras que a Zipperse puede convertir en una mónada (también de muchas formas). La diferencia está en si te enfocas conceptualmente en "agregar" datos de manera constructiva a una máquina de estado (de eso se trata la Monadinterfaz), o en "extraer" el estado de ella "deconstructivamente" (eso es lo que Comonadhace).

Sin embargo, no es fácil responder a la pregunta, planteada como "¿tiene sentido este entendimiento"? En cierto sentido lo hace, en otro no.

KT.
fuente