¿Qué es un Comonad y para qué sirven?

13

Recientemente he estado desempolvando mi conocimiento sobre cómo funcionan las mónadas. También me han introducido el concepto de 'Comonad' , que se describe como the inverso dual de una mónada . Sin embargo, soy imposible envolver mi cabeza alrededor de él.

Para entender las Mónadas, hice mi propia analogía:

  

Las mónadas se pueden ver como 'un plano para construir cintas transportadoras de   expresiones '.

     

Para definir una nueva Mónada (un nuevo tipo de sistema de cinta transportadora) que necesita definir:

     
  1. Una forma de poner algo en una cinta transportadora, por ejemplo. 'iniciar' una cinta transportadora. (Conocido como unit o return )
  2.   
  3. Una forma de conectar una máquina (una expresión) que formará parte de una cinta transportadora a una cinta transportadora. (Conocido como join o bind o >>= ).
  4.   

(Hay una tercera operación que toma la cinta transportadora actual, tira su contenido y comienza una nueva cinta transportadora conocida como >> , pero se usa muy rara vez).

     

Para que las máquinas y los transportadores funcionen correctamente juntos, deberá   es necesario asegurarse de que:

     
  1. Si coloca algo en una cinta transportadora y lo pasa a través de una máquina, la salida debería ser la misma que cuando pasa a través de la máquina.   Máquina manual. (Identidad izquierda)
  2.   
  3. Si desea colocar una cinta transportadora entre una cinta transportadora ya existente, no debe terminar con una cinta transportadora que tenga una   Cinta transportadora en la parte superior, sino una cinta transportadora más larga.    (Identidad derecha)
  4.   
  5. No debería importar para la salida si usa manualmente la máquina A, y luego pasa el resultado a través del B-C conectado al transportador, o si   use el transportador A-B conectado y luego pase el resultado manualmente a través de   C. En otras palabras: ((a > > = b) > > = c) debe ser igual a (a > > = (b > > = c)) (Asociatividad )
  6.   

La cinta transportadora más simple sería la que simplemente toma la   Entrada y siempre continúa a la siguiente expresión. Esto es lo que un   'tubería' es.

     

Otra posibilidad, es dejarlo pasar por la siguiente máquina si   alguna condición se cumple para el valor. Esto significa que si en alguna de las   expresiones intermedias, el valor cambia a algo que no es   más tiempo permitido, entonces el resto de las expresiones se omitirán. Esta   es lo que hace la mónada 'Tal vez' en Haskell.

     

También puede hacer otras reglas de copia / cambio condicionales de fantasía en el   Valores antes o después de pasarlos a una máquina. Un ejemplo: analizadores   (Aquí, si una expresión devuelve un resultado de 'error', el valor de    antes la expresión se usa como salida).

Por supuesto, la analogía no es perfecta, pero espero que ofrezca una buena representación de cómo funcionan las mónadas.

Sin embargo, estoy teniendo muchos problemas para cambiar esta analogía para entender a los Comonads. Sé por las pequeñas cantidades de información que he encontrado en Internet que un Comonad define:

  • extract , que es una especie de inverso de return , es decir, toma un valor hacia fuera de un Comonad.
  • duplicate , que es una especie de inverso de join , es decir, crea dos Comonads a partir de uno solo.

Pero, ¿cómo se puede crear una instancia de un Comonad si solo podemos extraer de ellos o duplicarlos? ¿Y cómo se pueden utilizar realmente? He visto este increíble proyecto y la charla sobre el tema (que, lamentablemente, entendí muy poco), pero no estoy seguro de qué parte de la funcionalidad es proporcionada por un Comonad exactamente.

¿Qué es un Comonad? ¿Para qué sirven? ¿Cómo se pueden utilizar? ¿Son comestibles?

    
pregunta Qqwy 16.06.2016 - 13:30

2 respuestas

8

Una comuna es, como una mónada, una estructura matemática en la teoría de categorías. El co-prefijo es muy común allí para denotar "inversos" como lo pones (aunque no creo que los matemáticos puros estén de acuerdo con la elección de la palabra).

En la teoría de categorías hay categories , que se coloca brevemente en una colección de objects (de cualquier tipo o naturaleza, la estructura interna es irrelevante) y algunos arrows entre estos objetos. Para que algo sea una categoría, las flechas deben seguir algunas leyes (identidad izquierda / derecha y asociatividad), pero eso no es realmente importante aquí.

Ahora, la teoría de categorías es muy abstracta / difícil de asimilar y vasta. Se necesita mucho tiempo para analizarlo todo (y no lo he estudiado formalmente, solo conozco algunos conceptos básicos), pero se usa una noción que se llama dual . Básicamente, para cada categoría puedes construir un opposite category simplemente haciendo lo mismo pero "invirtiendo todas las flechas". Esta es una definición muy ingenua, pero es difícil de resumir. El doble de algo en una categoría C es básicamente lo mismo en la categoría opuesta C_op (¿ya tienes dolor de cabeza?)

De todos modos, si tiene una mónada sobre alguna categoría (y una categoría puede ser, por ejemplo, una categoría donde los objetos son tipos en algún lenguaje de programación y las flechas son funciones entre los tipos), entonces una combinación es básicamente la misma cosa. , solo que ha invertido todas las flechas (como invertir las firmas de función en este caso).

En esta se puede encontrar una descripción más "práctica" (aunque no es SUPER práctica). discusión entre Erik Meijer y Brian Beckman en la que discuten la noción de dualidad y cómo Erik hizo "revertir las flechas" para IEnumerable<T> en C # al crear el marco reactivo y IObservable<T> (que, por lo que puedo decir, y Estoy feliz de ser corregido, básicamente es una instancia de lista comonad).

Otro ejemplo práctico de comonads mencionado en el video es el tipo Task<T> en .NET, donde Task<U> ContinueWith<U>(Func<Task<T>, U>) sería el doble de bind (o SelectMany como se llama en C #)

    
respondido por el sara 18.06.2016 - 21:58
1

Desde mi pequeña comprensión, una comonad es una máquina de Rube Goldberg para hacer post-docs:

enlace

... lo siento, no pude resistirme.

    
respondido por el dagnelies 20.06.2016 - 14:44

Lea otras preguntas en las etiquetas