
This makes me wonder: does that mean there is no such thing as an applicative transformer?
Applicative functors compose much more simply than monads, so you don't need transformers.
newtype Compose f g a = O (f (g a)) unO (O x) = x
instance (Functor f, Functor g) => Functor (Compose f g) where fmap f o = O $ fmap (fmap f) $ unO o
instance (Applicative f, Applicative g) => Applicative (Compose f g) where pure x = O $ pure $ pure x
-- unO of :: f (g (a -> b)) -- unO ox :: f (g a) -- to get result :: f (g b) -- we need to lift of to f (g a -> g b) -- which we do via (fmap (<*>)) :: f (g (a -> b)) -> f (g a -> g b) of <*> ox = O ((<*>) <$> unO of <*> unO ox)
Prettier implementations of this are available in the TypeCompose library. -- ryan