<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">Hi guys, the way `StateT` are implemented as `Applicative` have been buggling my mind for some time.</div><div class=""><a href="https://hackage.haskell.org/package/transformers-0.5.2.0/docs/src/Control.Monad.Trans.State.Lazy.html#line-201" class="">https://hackage.haskell.org/package/transformers-0.5.2.0/docs/src/Control.Monad.Trans.State.Lazy.html#line-201</a></div><div class=""><br class=""></div><div class=""><font face="Courier" class="">instance (Functor m, Monad m) => Applicative (StateT s m) where</font></div><div class=""><font face="Courier" class="">    pure a = StateT $ \ s -> return (a, s)</font></div><div class=""><font face="Courier" class="">    StateT mf <*> StateT mx = StateT $ \ s -> do</font></div><div class=""><font face="Courier" class="">        (f, s') <- mf s</font></div><div class=""><font face="Courier" class="">        (x, s'') <- mx s'</font></div><div class=""><font face="Courier" class="">        return (f x, s'')</font></div><div class=""><br class=""></div><div class="">Using dependant monadic computations, this implementation cannot be expressed in term of applicative.</div><div class="">This explains why we cannot have `instance (Applicative m) => Applicative (State s m)`.</div><div class="">However using real monadic style computations for implementing `<*>` buggles my mind.</div><div class="">Moreover `liftA2 (<*>)` can be used to generically compose applicative functors so why monads are needed?</div><div class=""><a href="https://www.haskell.org/haskellwiki/Applicative_functor#Applicative_transfomers" class="">https://www.haskell.org/haskellwiki/Applicative_functor#Applicative_transfomers</a></div><div class=""><br class=""></div><div class="">Any inputs would be greatly appreciated!</div><div class=""><br class=""></div><div class="">Cheers,</div><div class="">Laurent</div></body></html>