¿Qué es la clase de tipo Comonad en Haskell?

105

¿Qué es la clase de tipo Comonad en Haskell? Como en Comonad de Control.Comonad en el paquete comonad (también se agradecen las explicaciones de cualquier otro paquete que proporcione una clase de tipo Comonad). He oído hablar vagamente de Comonad, pero todo lo que realmente sé es que proporciona extract :: w a -> a, una especie de paralelo con el de Monad return :: a -> m a.

Puntos de bonificación por señalar los usos "reales" de Comonad en código "real".

Dan Burton
fuente
Realmente me gustaría ver cuál es la diferencia entre "co" y normal. Sé lo que es una mónada. Entonces, si sé lo que significa "co", puedo concluir yo mismo qué es una comónada y comprenderlo profundamente. La respuesta de Alexey Romanov no hizo nada en ese aspecto.
Evi1M4chine
2
@ Evi1M4chine: "co" (vagamente) significa "voltear las flechas". Aquí hay una imagen aproximada de eso. Considere las operaciones monádicas: return :: a ~> m a, flip bind :: (a ~> m b) -> (m a ~> m b). Revertir las flechas onduladas y se obtiene las operaciones comonadic: extract :: a <~ w a, extend :: (a <~ w b) -> (w a <~ w b)( extract :: w a -> a, extend :: (w a -> b) -> w a -> w b)
Dan Burton
Gracias @Dan Burton ... así que mientras con una mónada, trabajas en el "interior" (metiendo cosas nuevas y alteradas), con un comonad, trabajas en el "exterior" (sacando cosas finalmente o simplemente para alterarlas) . ¿Es esa opinión correcta? Porque ciertamente ayuda mucho con la comprensión profunda.
Evi1M4chine
Las comonads se pueden utilizar para modelar co-efectos. Aquí hay una excelente introducción a los coeffectos: tomasp.net/coeffects
zeronone

Respuestas:

83

Estos enlaces pueden resultar útiles:

  1. La evaluación de los autómatas celulares es comonádica . En particular, "siempre que vea grandes estructuras de datos ensambladas a partir de muchos cálculos pequeños pero similares, es muy probable que estemos tratando con un comonad".
  2. Secuencias, flujos y segmentos
  3. Comónadas en la vida cotidiana
Alexey Romanov
fuente
1
+1 El primer enlace fue el que realmente me unió.
luqui
42
La respuesta de solo enlace debe contener al menos un resumen de los contenidos vinculados. Actualmente, esta respuesta no es adecuada para ser una buena respuesta SO. Considere expandirlo un poco, para que pueda sostenerse por sí solo sin los artículos vinculados.
Bakuriu
3
"siempre que veas grandes estructuras de datos ensambladas a partir de muchos cálculos pequeños pero similares, es muy probable que estemos tratando con un comonad" ... Entonces, ¿eso significa que los sombreadores de fragmentos son comonadic?
Sam Kellett
Encontré este ejemplo de extendútil.
Chris Penner
22

Esto no responde completamente a mi pregunta, pero quería poner información relevante en formato de respuesta:

"co" (vagamente) significa "voltear las flechas". Aquí hay una imagen aproximada de eso.

Considere las operaciones monádicas:

return :: a ~> m a
flip (>>=) :: (a ~> m b) -> (m a ~> m b)

Invierta las flechas onduladas y obtendrá las operaciones comonádicas:

extract :: a <~ w a
extend :: (a <~ w b) -> (w a <~ w b)

(Escrito con flechas normales)

extract :: w a -> a
extend :: (w a -> b) -> w a -> w b

Observe cómo en este formato, returnes una flecha que casualmente encaja en el espacio del argumento para flip (>>=), y lo mismo ocurre con extracty extend. Las leyes de mónada / comónada dicen que cuando pones returno extracten ese espacio, el resultado es la flecha de identidad. Las leyes son las mismas, "solo con las flechas al aire". Esa es una respuesta súper manual, pero espero que brinde alguna información.

Dan Burton
fuente
2
Tu respuesta va bien al evitar la falacia del tutorial de mónadas. Las mónadas (y comónadas) son solo una interfaz. Aunque de hecho sería genial saber cómo están destinados . Como en: La idea detrás de ellos.
Evi1M4chine