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ónadaM
y 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?