¿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 respuestas

os 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 relacionad

Otra 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.

Discusió

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, laListTl 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.

Respuestas a la pregunta(1)

Su respuesta a la pregunta