Las mónadas se utilizan prácticamente en todas partes en la ingeniería de software. No siempre somos conscientes de ellos. Pero donde sea que esté usando listas, errores, estados, analizadores, futuros, E / S o generadores de números aleatorios, es muy probable que esté haciendo uso del hecho de que estas cosas forman mónadas.
La funcionalidad básica proporcionada por todas las mónadas (y, por lo tanto, la razón para usarlas como mónadas) es la sustitución y la normalización . Lo básico que una mónada le permite hacer es la asignación de variables y sustituir las subexpresiones por variables. La mónada luego vuelve a normalizar la expresión a una nueva que tiene sus subexpresiones injertadas donde solían estar las variables. Cada mónada tiene algún efecto y el procedimiento de renormalización (la unión monádica o la transformación natural µ ) determina cómo se combinan los efectos.
Por ejemplo, en una lista de enteros, puede ver cada uno de ellos como una variable. Entonces, si tiene una función de enteros a listas (de tipo Integer -> List x
), puede sustituir una lista de valores de tipo `x` para cada una de las variables enteras que le da una lista de listas. Luego, elimina los corchetes internos (normalizar) para terminar con una lista simple donde cada uno de sus enteros ha sido reemplazado por cero o más elementos de tipo `x`. Aquí está eso en acción:
- ¿Qué tan útil será el algoritmo de Shor para las computadoras cuánticas?
- Cómo trabajar en unidades donde c = 1
- ¿De cuántas maneras podemos dividir una cadena de 10 caracteres en más de 2 subcadenas consecutivas no vacías?
- ¿Podrá la inteligencia artificial resolver un problema matemático abierto, como la conjetura de Goldbach o la hipótesis de Riemann?
- Dadas N monedas, colocadas en una fila, indexadas 1 a N de izquierda a derecha. Inicialmente todas las monedas muestran cabeza. En cada turno, dos enteros, no necesariamente distintos, A y B entre 1 y N (inclusive) se eligen de manera uniforme al azar. Todas las monedas con un índice de A a B (inclusive) se voltean. ¿Cuál es el número esperado de monedas que muestran la cabeza después de que M gira?
para { i <- enteros r <- númerowang (i) } rendimiento r
Con una mónada de error, tendrá alguna expresión `e` que sea un error o un valor. Puede ver ese valor como una variable y sustituir la variable por otra expresión `f` (que también podría ser un error). Cuando la mónada se renormaliza, obtienes una sola expresión `g`. Si `e` hubiera fallado, entonces` g` falla con ese error. De lo contrario, falla con el error de `f`, o tiene éxito si no hubo errores. Ejemplo:
para { i <- mightError r <- mightAlsoError (i) } rendimiento r
Podríamos repetir este patrón para todas las mónadas. Pero el poder real proviene del hecho de que podemos abstraernos de la mónada y escribir programas que no solo funcionen con listas, o solo con futuros, o simplemente con errores, sino con cualquier mónada. Todos comparten una interfaz común que podemos explotar y programar. En la práctica, hay una enorme biblioteca de funciones que pueden escribirse de una vez por todas y reutilizarse para cualquier mónada. Y como las mónadas están en todas partes, esto es muy útil.
Para los teóricos de la categoría, las mónadas que se utilizan en ingeniería de software son específicamente (generalmente) las mónadas en Set .