¿Qué es una mónada?

En la programación funcional, normalmente solo se trata de una categoría, la categoría de tipos. Esto se llama comúnmente Hask cuando se trata de Haskell.

Tenga en cuenta que Hask no es solo una colección (o clase) de tipos. También contiene morfismos entre los tipos. Estas son solo funciones.

Un functor es como una función entre dos categorías. Un functor de una categoría en sí mismo es un endofunctor: nombre aterrador, concepto simple.

Un endofunctor en Haskell es básicamente un constructor de tipos, una función que toma un tipo y produce un nuevo tipo. Sin embargo, tenga en cuenta que un functor no solo trata con los objetos de la categoría (tipos en nuestro caso) sino también con los morfismos. Ese es el trabajo de fmap en Haskell. (Entonces, lo que se llama un functor en el lenguaje de Haskell quizás se llama con mayor precisión un endofunctor).

Una mónada es un endofunctor, nuevamente, solo un Functor en Haskell, junto con otras dos operaciones especiales (llamadas transformaciones naturales, pero no nos preocupemos demasiado por eso). Recuerde que el endofunctor aquí viene con un constructor de tipo, digamos T

Una de estas operaciones, llamada retorno o elevación , toma un objeto de tipo x y produce un objeto de tipo T x . Eso es bastante simple. Entonces, por ejemplo, en la mónada de la lista, esta operación toma un objeto, digamos de tipo Int , y produce un objeto de tipo [Int] . (¿Qué objeto, específicamente, podría producir? Por supuesto, solo la lista singleton cuyo elemento es precisamente el entero proporcionado).

La otra operación especial, llamada join , es un poco más interesante. Toma un objeto de tipo T (T x) y produce un objeto del tipo más simple T x : aplana las dos aplicaciones sucesivas del constructor de tipos. Nuevamente, como con todo esto, en realidad es muy simple. En la lista mónada, por ejemplo, esta operación de unión es solo concatenación de listas: toma una lista de listas y produce una sola lista.

Moggi introdujo las mónadas a la programación al tratar de asignar “nociones de computación” a las funciones. Una noción de computación es algo que una computadora puede realizar, pero normalmente no la expresamos como una función pura. Por ejemplo, podemos expresarlo como una función parcial, o una función que tiene acceso al estado externo. Estos son bastante comunes en los idiomas imperativos.

Moggi dijo: Oye, puedo convertir esas pseudofunciones en funciones puras si me dejas enriquecer su tipo de retorno. Por ejemplo, una función parcial que devuelve el tipo a (o que falla) se puede convertir en una función pura que devuelve Quizás a (usando la notación de Haskell para simplificar). Quizás los valores son como los valores mejorados por un bit “válido”. Quizás asigna cualquier tipo de a Quizás a. (De hecho, es un functor que actúa en la categoría de todos los tipos).

¿Qué tal una noción de cálculo que es como una función que devuelve a, excepto que accede a algún estado externo? Bueno, vamos a convertirlo en una función pura que, en lugar de devolver a, devuelve una acción, que en sí misma es una función que toma el estado como argumento y devuelve a. Nuevamente, tenemos un mapeo de tipos de a a st-> a (donde st es el tipo de estado).

Pero, ¿cómo componimos esas funciones enriquecidas? Resulta que es suficiente introducir una función de orden superior “bind” (u operador >> = en Haskell) que toma un valor enriquecido, el resultado de la primera función enriquecida, y la segunda función enriquecida, y los une para producir un valor enriquecido

Para completar la imagen, necesita una forma de enriquecer trivialmente un valor específico. Esta función se llama “retorno” en Haskell.

Agregue algunos axiomas bastante naturales y tendrá una mónada.

El mejor tutorial para comprender a las mónadas que he visto es el que dio un miembro de nuestro grupo local de usuarios de FP. Basó su presentación en este artículo: http://blog.sigfpe.com/2006/08/y

En resumen, las mónadas son un par de funciones que lo ayudan a aplicar un comportamiento adicional a las funciones existentes sin cambiar sus implementaciones. Lo hacen haciendo que las entradas y salidas de las funciones estén en el mismo dominio, haciendo que las funciones ajustadas sean componibles en cualquier combinación.

Probablemente me darán una palmada por esa respuesta ingenua e incompleta, pero es la forma más sencilla de entenderlos, en mi opinión, y no está llena de jerga FP.

More Interesting

¿Hay algún equivalente a lanzar la moneda en informática?

¿Cuál es la diferencia entre autómatas deterministas y no deterministas de estado finito?

Cómo mostrar que para cada número entero n, n> 0, el número entero (9 ^ n) -1 es divisible por 8

Dada la potencia computacional suficiente, ¿serían los objetivos de la mecánica del continuo tan complicados de lograr? Es decir, ¿sería matemáticamente más sencillo modelar sistemas de forma discreta que continua?

¿Existe una función que defina la relación entre el dígito inicial de un entero y el número de términos cuando se agrega infinitamente?

Cómo usar el pecado y dónde usar cos en vectores

¿Por qué debería elegir especializarme en ciencias de la computación en lugar de las matemáticas?

¿Qué tan eficientemente la computadora Quantum puede resolver el problema P vs NP?

¿Cuál es la función más compleja que has visto que, lógicamente, no debería funcionar, pero sí lo hace?

¿Podemos crear música original a través de la permutación digital?

¿Cuál es el número más alto representable en la codificación de complemento a dos de 8 bits?

¿Por qué diferenciamos entre máquinas Turing universales y máquinas Turing normales?

¿Cuál es la diferencia entre la variable de control y la variable de confusión?

¿Cuáles son las similitudes y diferencias entre recursividad e iteración?

¿Cuáles son sus puntos de vista sobre la teoría de la homotopía y su conexión con la informática teórica?