¿Cuál es un ejemplo explícito de una mónada sin transformador de mónada? [duplicar
Esta pregunta ya tiene una respuesta aquí:
Existe una mónada que no tenga un transformador de mónada correspondiente (excepto IO)? 4 respuestasos transformadores de @Monad son conocidos por todas las mónadas estándar (Reader, Writer, State, Cont, List, etc.), pero cada uno de estos transformadores de mónada funciona de una manera ligeramente diferente. No existe un método o fórmula general para construir un transformador de mónada dada la definición de un constructor de tipos con una instancia de mónada. Por lo tanto, no se garantiza que un tipo de datos de mónada diseñado de acuerdo con algunos requisitos comerciales arbitrarios tendrá un transformador de mónada. ¿Hay un ejemplo tan explícito?
Trabajo relacionadOtra pregunt explica que una composición functor de dos mónadas no es necesariamente una mónada. Ver tambiénesta pregunt. Esos ejemplos no responden a la presente pregunta, simplemente ilustran el problema de no tener un método general para construir un transformador de mónada. Esos ejemplos muestran que, dadas dos mónadas M y N, a veces encontraremos que M (N a) es una mónada, a veces que N (M a) es una mónada, y a veces tampoco lo será. Pero esto no muestra ni cómo construir un transformador de mónada para M o N, ni si existe en absolut
Una respuesta a otra pregunta argumenta que laIO
mónadano pode tiene un transformador de mónada porque si tuviera unoIOT
, podríamos aplicarIOT
aList
, y luego levantar una lista vacía lift []
) en la mónada resultante tendría que deshacer los efectos secundarios realizados "anteriormente" por la mónada IO. Este argumento se basa en la idea de queIO
mónada "realmente realiza" efectos secundarios que, presumiblemente, no se pueden deshacer. Sin embargo, elIO
monad no es un constructor de tipo explícito.
En cada ejemplo donde se da un tipo de mónada explícitamente, se puede encontrar un transformador de mónadade alguna maner, - a veces se requiere cierto ingenio. Por ejemplo, laListT
l transformador @ que existía en la biblioteca de Haskell erarelativamente reciente encontró que @ era incorrecto de una manera sutil, pero el problema finalmente se solucionó cambiando la definición deListT
.
Ejemplos estándar de mónadas sin transformadores son mónadas comoIO
, que en realidad no está definido por un constructor de tipo explícito -IO
es un tipo "mágico" opaco definido por la bibliotecade alguna maner, a bajo nivel. Parece claro que oneno pode defineIO
como un constructor de tipo explícito, con una instancia de mónada dada por funciones puras. LosIO
ejemplo muestra que un transformador de mónada puede no existir si permitimos que la instancia de mónada contenga código oculto de bajo nivel con efectos secundarios impuros. Entonces, limitemos nuestra atención a las mónadas implementadas usando funciones puras.
No parece haber un algoritmo que pueda derivar transformadores de mónada automáticamente del código fuente de la mónada. ¿Sabemos siquiera que esto siempre es posible?
ara dejar más claro lo que quiero decir con un "ejemplo explícito" de una mónada: supongamos que afirmo que
type Q u v a = ((u -> (a, Maybe a)) -> v) -> u -> (a, Maybe a)
puede tener una @ legMonad
instancia con respecto al parámetro de tipoa
, y produzco el código fuente para una implementación deMonad
instancia paraQ u v
como funciones purasreturn
yjoin
. ¿Entonces sabemos queQ u v
tiene un transformador de mónadaQT u v
tal queQT u v Id
es equivalente aQ u v
, y las leyes de los transformadores de mónada se mantienen? ¿Sabemos entonces cómo construirQT
explícitamente? Yo no
Para decidir esta pregunta, necesitamos ya sea
para demostrar un algoritmo que encontraría un transformador de mónada a partir de un constructor de tipo arbitrario dado y una implementación dada de una instancia de mónada; p.ej. dado el códigotype F a = r -> Either (a, a) (a, a, Maybe a)
y una implementación de una instancia de mónada para esto, para encontrar el código para el transformador de mónada; limitémonos a escribir constructores hechos de cualquier combinación de->
, tupla yEither
por simplicidad; para demostrar un contraejemplo: unaexplícitonstructor de tipo @ monad, dado por una definición de código explícito, p. @type F a = r -> Either (a, a, a) (a, a, Maybe a)
o lo que sea, de modo que sea una @ legMonad
, con unMonad
instancia dada por funciones puras, pero podemosproba eseF
no tiene transformador de mónada.