В настоящее время я работаю над Data.Fresh
и Control.Monad.Trans.Fresh
, которые соответственно. определить интерфейс для генерации свежих переменных и трансформатор монады, который реализует этот интерфейс.
Первоначально я думал, что возможно реализовать экземпляр Applicative
для моего FreshT v m
с единственным требованием, что Applicative m
существует. Тем не менее, я застрял, и мне показалось, что мне нужно Monad m
. Не доверяя моему Haskell-fu, я затем повернулся к пакету трансформаторов и был удивлен тем, что нашел в Control.Monad.Trans.State.Lazy
и .Strict
:
instance (Functor m, Monad m) => Applicative (StateT s m) where
pure = return
(<*>) = ap
Итак, вот мой вопрос: возможно ли создать экземпляр с эквивалентной семантикой со следующей головой экземпляра?
instance (Applicative m) => Applicative (StateT s m) where