Attualmente sto lavorando su Data.Fresh
e Control.Monad.Trans.Fresh
, che risp. definire un'interfaccia per generare nuove variabili e un trasformatore monad che implementa questa interfaccia.E 'possibile implementare `(Applicativo m) => Applicativo (StatoT s m)`?
Inizialmente ho pensato che sarebbe stato possibile implementare l'istanza Applicative
per il mio FreshT v m
con l'unico requisito che esista Applicative m
. Tuttavia, mi sono bloccato e mi è sembrato di dover richiedere Monad m
. Non fidandosi mia Haskell-fu, ho poi girato al pacchetto trasformatori, e sono rimasto sorpreso da ciò che ho trovato in Control.Monad.Trans.State.Lazy
e .Strict
:
instance (Functor m, Monad m) => Applicative (StateT s m) where
pure = return
(<*>) = ap
Quindi ecco la mia domanda: è possibile creare un'istanza con la semantica equivalenti con la testa dell'istanza seguente?
instance (Applicative m) => Applicative (StateT s m) where
È interessante notare che ci sono altri trasformatori (ad esempio, 'WriterT',' ExceptT'), il cui ' L'istanza di Applicativo richiede che il costruttore di tipo sottostante sia un 'Monade'. – kirelagin