En programación funcional , un transformador de mónadas es un constructor de tipos que toma una mónada como argumento y devuelve una mónada como resultado.
Los transformadores de mónadas permiten componer funcionalidades encapsuladas por mónadas —como el estado, el manejo de excepciones y la entrada/salida— de forma modular. Normalmente, un transformador de mónada se crea generalizando una mónada existente; al aplicar el transformador resultante a la mónada identidad, se obtiene una mónada equivalente a la original (sin tener en cuenta el empaquetado ni el desempaquetado necesarios).
Definición
Un transformador de mónada consta de:
- Un constructor de tipos
tde clase(* -> *) -> * -> * - Operaciones de mónadas
returnybind(o una formulación equivalente) para todot mdondemes una mónada, que satisface las leyes de las mónadas. - Una operación adicional, , que satisface las siguientes leyes: [ 1 ] (la notación que aparece a continuación indica la aplicación infija):
lift :: m a -> t m a`bind`lift . return = returnlift (m `bind` k) = (lift m) `bind` (lift . k)
Ejemplos
El transformador de mónada de opciones
Dado cualquier mónada, el transformador de mónada de opciones(dóndedenota el tipo de opción ) se define por:
- :&A\rightarrow \mathrm {M} \left(A^{?}\right)\\&a\mapsto \mathrm {return} (\mathrm {Just} \,a)\\\mathrm {bind} :&\mathrm {M} \left(A^{?}\right)\rightarrow \left(A\rightarrow \mathrm {M} \left(B^{?}\right)\right)\rightarrow \mathrm {M} \left(B^{?}\right)\\&m\mapsto f\mapsto \mathrm {bind} \,m\,\left(a\mapsto {\begin{cases}{\mbox{devolver nada}}&{\mbox{if }}a=\mathrm {Nada} \\f\,a'&{\mbox{if }}a=\mathrm {Sólo} \,a'\end{cases}}\right)\\\mathrm {lift} :&\mathrm {M} (A)\rightarrow \mathrm {M} \left(A^{?}\right)\\&m\mapsto \mathrm {bind} \,m\,(a\mapsto \mathrm {return} (\mathrm {Just} \,a))\end{array}}}
El transformador de mónadas de excepción
Dado cualquier mónada, el transformador de mónadas de excepción(donde E es el tipo de excepciones) se define por:
- :&A\rightarrow \mathrm {M} (A+E)\\&a\mapsto \mathrm {return} (\mathrm {valor} \,a)\\\mathrm {bind} :&\mathrm {M} (A+E)\rightarrow (A\rightarrow \mathrm {M} (B+E))\rightarrow \mathrm {M} (B+E)\\&m\mapsto f\mapsto \mathrm {bind} \,m\,\left(a\mapsto {\begin{cases}{\mbox{return err }}e&{\mbox{if }}a=\mathrm {err} \,e\\f\,a'&{\mbox{if }}a=\mathrm {value} \,a'\end{cases}}\right)\\\mathrm {lift} :&\mathrm {M} \,A\rightarrow \mathrm {M} (A+E)\\&m\mapsto \mathrm {bind} \,m\,(a\mapsto \mathrm {return} (\mathrm {valor} \,a))\\\end{array}}}
El transformador de mónadas del lector
Dado cualquier mónada, el transformador de mónadas del lector(donde E es el tipo de entorno) se define por:
- :&A\rightarrow E\rightarrow \mathrm {M} \,A\\&a\mapsto e\mapsto \mathrm {return} \,a\\\mathrm {bind} :&(E\rightarrow \mathrm {M} \,A)\rightarrow (A\rightarrow E\rightarrow \mathrm {M} \,B)\rightarrow E\rightarrow \mathrm {M} \,B\\&m\mapsto k\mapsto e\mapsto \mathrm {bind} \,(m\,e)\,(a\mapsto k\,a\,e)\\\mathrm {lift} :&\mathrm {M} \,A\rightarrow E\rightarrow \mathrm {M} \,A\\&a\mapsto e\mapsto a\\\end{array}}}
El transformador de mónada de estado
Dado cualquier mónada, el transformador de mónada de estado(donde S es el tipo de estado) se define por:
- :&A\rightarrow S\rightarrow \mathrm {M} (A\times S)\\&a\mapsto s\mapsto \mathrm {return} \,(a,s)\\\mathrm {bind} :&(S\rightarrow \mathrm {M} (A\times S))\rightarrow (A\rightarrow S\rightarrow \mathrm {M} (B\times S))\rightarrow S\rightarrow \mathrm {M} (B\times S)\\&m\mapsto k\mapsto s\mapsto \mathrm {bind} \,(m\,s)\,((a,s')\mapsto k\,a\,s')\\\mathrm {levantar} :&\mathrm {M} \,A\rightarrow S\rightarrow \mathrm {M} (A\times S)\\&m\mapasto s\mapsto \mathrm {bind} \,m\,(a\mapsto \mathrm {return} \,(a,s))\end{array}}}
El escritor transformador de mónadas
Dado cualquier mónada, el escritor transformador de mónadas(donde W está dotado de una operación monoide ∗ con elemento identidad) se define por:
- :&A\rightarrow \mathrm {M} (W\times A)\\&a\mapsto \mathrm {return} \,(\varepsilon ,a)\\\mathrm {bind} :&\mathrm {M} (W\times A)\rightarrow (A\rightarrow \mathrm {M} (W\times B))\rightarrow \mathrm {M} (W\times B)\\&m\mapsto f\mapsto \mathrm {bind} \,m\,((w,a)\mapsto \mathrm {bind} \,(f\,a)\,((w',b)\mapsto \mathrm {return} \,(w*w',b)))\\\mathrm {lift} :&\mathrm {M} \,A\rightarrow \mathrm {M} (W\veces A)\\&m\mapsto \mathrm {bind} \,m\,(a\mapsto \mathrm {return} \,(\varepsilon ,a))\\\end{array}}}
El transformador de mónada de continuación
Dado cualquier mónada, el transformador de mónada de continuación asigna un tipo arbitrario R a funciones de tipodonde R es el tipo de resultado de la continuación. Se define por:
Tenga en cuenta que las transformaciones de mónadas generalmente no son conmutativas : por ejemplo, aplicar el transformador de estado a la mónada de opción produce un tipo(un cálculo que puede fallar y no producir ningún estado final), mientras que la transformación inversa tiene tipo(un cálculo que produce un estado final y un valor de retorno opcional).
Véase también
Referencias
Enlaces externos
- Una entrada de blog que revisa brevemente parte de la literatura sobre transformadores de mónadas y conceptos relacionados, con un enfoque en el tratamiento categórico-teórico.
- Programación funcional