Poner en orden las mónadas: convertir la aplicación de un transformador de mónada en mónada de nuevo tipo

Estoy tratando de tomar p.ExceptT a (StateT A M), para algún tipo de hormigónA y mónadaMy envolverlos en mis nuevas mónadas personalizadas.

Primero identifiqué queStateT A M aparece a menudo en otros contextos y, por lo tanto, decidí que sería mejor envolver eso solo en una mónadaM1 y luego envolverExceptT a M1 dentroM2.

La propiedad deseada es hacerM1 yM2 instancias deMonadState y la clase deM (supongamos que se llamaMyMonadClass) tambiénM2 debería ser una instancia deMonadError.

Primero comencé con sinónimos de tipo simple:

type MyState    = StateT A M
type MyBranch a = ExceptT a MyState

luego pensé que primero esbozaría las declaraciones de instancia (sin implementar la instancia) y ahí es donde me quedé atascado.instance MonadState A (MyState) parecía no ser la sintaxis correcta. Pensé que tendría que crearnewtype MyState' a = StateT a M y entoncestype MyState = MyState A (No utilice extensiones de idioma cuando no sea necesario).

Sin embargo, una vez que comencé a convertir los sinónimos ennewtype declaraciones empecé a perder la conexión con elStateT A M yExceptT ... tipos.

newtype MyState' s a = MyState' { runMyState :: s -> (s, a) }
type MyState = MyState' A
newtype MyBranch e a = MyBranch { runMyBranch :: MyState (Either e a) }

Ahora los transformadores que ya están implementados desaparecieron y creo que estoy tratando de hacer algo que no tiene mucho sentido. Entonces, mi pregunta es: ¿cómo podría uno envolver correctamente este tipo de comportamiento en nuevas mónadas compuestas que hacen accesibles las capas debajo para evitar levantar objetos innecesarios y mantener las cosas claras y bien organizadas?

Respuestas a la pregunta(1)

Su respuesta a la pregunta