¿Es posible implementar `(Applicative m) => Applicative (StateT s m)`?
Actualmente estoy trabajando enData.Fresh
yControl.Monad.Trans.Fresh
, que resp. define una interfaz para generar nuevas variables y un transformador de mónada que implementa esta interfaz.
Inicialmente pensé que sería posible implementar elApplicative
instancia para miFreshT v m
con el único requisito de queApplicative m
existe Sin embargo, me quedé atascado y parecía que necesitaba requerirMonad m
. Sin confiar en mi Haskell-fu, me volví hacia el paquete de transformadores y me sorprendió lo que encontré enControl.Monad.Trans.State.Lazy
y.Strict
:
instance (Functor m, Monad m) => Applicative (StateT s m) where
pure = return
(<*>) = ap
Así que aquí está mi pregunta: ¿es posible crear una instancia con semántica equivalente con el siguiente encabezado de instancia?
instance (Applicative m) => Applicative (StateT s m) where