Mónada (programación funcional)
En la programación funcional , una mónada (monad en inglés), es un patrón de diseño que representa cálculos definidos como una secuencia de pasos, permitiendo componer funciones con tipos incompatibles encapsulándolos en un tipo monádico.Esto le permite al programador crear tuberías informáticas que procesan datos en pasos, a los cuales se les asocia un decorador con reglas de proceso adicionales provistas por la mónada.[2] También se las puede ver como un patrón de diseño funcional para construir tipos genéricos.Esto permite que tales conceptos sean definidos en maneras puramente funcionales sin el uso de extensiones a la semántica del lenguaje.Los lenguajes como Haskell proveen mónadas en el núcleo estándar, permitiendo a los programadores reutilizar largas partes de su definición formal y aplicar en diversas librerías las mismas interfaces para combinar funciones.[8] El concepto de mónada en la programación apareció en los '80 en el lenguaje Opal, aunque se le llamaban “comandos” y nunca fueron formalmente especificados.Eugenio Moggi fue el que por primera vez describió el uso general de las mónadas para estructurar programas en 1991.Por un largo tiempo, Haskell y sus derivados han sido los únicos usuarios mayores de mónadas en la programación.Si ambas mx y my tienen valores Just, queremos regresar Just su suma; pero si mx o my son Nothing, queremos regresar Nothing.Si se intentara escribir funciones con este tipo de conducta, se terminaría con una serie de casos “if Nothing then Nothing else something with x in Just x” que rápidamente se volverían confusos:[1] Para aliviar esto, podemos definir operaciones para encadenar tales cómputos de manera conjunta.Usando un poco de azúcar sintáctico, conocida como notación do, el ejemplo puede ser escrito como: Dado que este tipo de operación es muy común, existe una función estándar en Haskell (liftM2) que toma dos valores mónadicos (aquí: dos Maybes) y combina sus contenidos (dos números) usando otra función (adición), haciendo posible escribir el ejemplo pasado como: La mónada escritora permite que un proceso lleve información adicional “al lado” de su valor de cómputo.y removeFile (remueve el archivo) en la librería estándar de Haskell tienen los siguientes tipos Así que uno puede pensar removeFile como una función que, dado un FilePath, regresa una acción IO ; esta acción se encargará de que el mundo, en este caso el sistema de archivos, no tendrá un archivo nombrado por tal FilePath cuando sea ejecutado.Por otra parte, en doesFileExist, la función regresa una acción IO que envuelve a un valor booleano True o False; esto conceptualmente representa un nuevo estado del mundo donde el llamante sabe por cierto que un FilePath está presente o no dentro del sistema de archivos en el momento que la acción fue realizada.Este proceso es similar a como la lógica temporal representa el paso del tiempo usando solo proposiciones declarativas.El siguiente ejemplo clarifica en detalle como este encadenamiento de acciones ocurre en un programa.En adición, necesitamos ser capaces de componer estas primitivas para formar programas más grandes.Claramente , existe una estructura común entre las definiciones I/O y las Maybe, aun si son diferentes en muchas maneras.El concepto general de mónadas incluye una situación donde el programador quiere llevar a cabo un cómputo puramente funcional mientras que un cómputo relacionado se lleva a cabo al lado.Para que una mónada se comporte de la manera correcta, sus definiciones deben seguir ciertos axiomas, los cuales en su conjunto son llamados leyes mónadicas.Aunque hay ocasiones en las que tiene sentido usar el operador union >>= directamente en un programa, es más típico usar la llamada notación do (performn-notation en Ocaml, expresiones de computación en F Sharp, que mimetiza la apariencia de los lenguajes imperativos.Por ejemplo, el siguiente código: es transformado durante la compilación a: Es útil ver la implementación de la mónada lista.El bloque de notación-do puede ser usado con cualquier mónada ya que solo es azúcar sintáctica para: >>=.Las siguientes definiciones para la división segura de valores en la mónada Maybe también son equivalentes: Un ejemplo similar en F# usando una expresión de computación: El azúcar sintáctica del bloque maybe sería traducido internamente a la siguiente expresión: Dados los valores producidos por la división segura, podríamos querer seguir haciendo cálculos sin tener que checar manualmente si son Nothing (es decir el resultado de intentar hace runa división por 0).El tipo signature dice: Si m es una mónada, podemos levantar cualquier función binaria por encima de ella.Algunos tipos familiares de colección, incluyendo las listas, los sets y multisets, son mónadas.Las declaraciones como if condition x y then return () else mzero son usualmente vistas; si la condición es verdad, la opción no determinística se realiza desde un camino dummy de cómputo, el cual regresa un valor que no asignamos a nada; sin embargo, si la condición es falsa, entonces la mónada de valor no determinístico mzero = [] escoge desde 0 valores, terminando así efectivamente tal camino de cómputo.Así que las mónadas colección son muy útiles para resolver puzles lógicos, Sudoku, y problemas similares.El proceso vagamente corresponde a regresarse: un camino es escogido, después falla en cierto punto (si es que se evalúa mzero), posteriormente se regresa al último punto de ramificación, y sigue el otro camino, y así hasta terminar.Es usada en combinación con bind para actualizar el valor auxiliar sin afectar el computo principal.Las funcinoes return y bind son las siguientes: La función llamada con-continuación actual está definida de la siguiente manera: Otros conceptos que los investigadores han expresado como mónada incluyen: Las co-mónadas son el dual categórico de las mónadas.