¿Puedo entender mónada como un contenedor que realiza ciertos cálculos?

Sabes qué es la composición de funciones. El resultado de una función se pasa como argumento a otra. Para eso, el tipo del resultado del primero debe ser el mismo que el del argumento del segundo.

Una mónada es una generalización de la composición de funciones donde los dos tipos no coinciden exactamente. El resultado de la primera función es un contenedor (generalizado) de valores de tipo a , y el tipo de argumento de la segunda función es a sí mismo. Una mónada nos dice cómo pegar (o bind ) los dos extremos.

Y así como la composición de la función tiene una unidad, la identificación de la función de identidad, una mónada define una unidad de composición monádica, return .

Hay varias formas equivalentes de definir una mónada. El que mejor expone la composición está escrito en términos de flechas de Kleisli ( >=> en Haskell). Pero la definición más popular es la de términos de enlace o >>= , que es un poco menos obvio. Esto se debe a que bind está escrito en el estilo de paso continuo. En lugar de componer dos funciones, compone el “contenedor”, presumiblemente devuelto por alguna otra función monádica, con “el resto del cálculo monádico”, que es una flecha de Kleisli. Esta flecha es la continuación.

¿Qué tiene que ver una mónada con los efectos secundarios? Sucede que lo que generalmente se describe como efectos secundarios en la programación imperativa se puede implementar utilizando funciones puras con un tipo de retorno embellecido: funciones que devuelven un “contenedor”. (Un contenedor generalizado puede incluso ser una función que produce el valor deseado). Puede encadenar tales funciones manualmente desempacando el contenedor cada vez, pero es complicado y propenso a errores. Una mónada hace que sea muy fácil.

No creo que la respuesta de Philip Wadler a esto haya sido mejorada. Tome su papel, Monads for Functional Programming , y léalo cuidadosamente. (Un conocimiento de la sintaxis de Haskell ayudará.) http://homepages.inf.ed.ac.uk/wa