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:
- Una forma de poner algo en una cinta transportadora, por ejemplo. 'iniciar' una cinta transportadora. (Conocido como
unit
oreturn
)- Una forma de conectar una máquina (una expresión) que formará parte de una cinta transportadora a una cinta transportadora. (Conocido como
join
obind
o>>=
).(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:
- 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)
- 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)
- 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 )
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 dereturn
, es decir, toma un valor hacia fuera de un Comonad. -
duplicate
, que es una especie de inverso dejoin
, 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?