假设我们具有以下类型类。
class MonadTrans t => MonadLower t where
lower :: Monad m => t Identity a -> t m a
作为一个简单的例子,我们可以如下实现MonadLower
的MaybeT
实例。
instance MonadLower MaybeT where
lower (MaybeT (Identity maybe)) = MaybeT (return maybe)
但是,我不知道如何为MonadLower
实现ContT r
的实例。
instance MonadLower (ContT r) where
lower (ContT f) = ContT $ \k -> ???
甚至有可能为每个MonadLower t
创建一个MonadTrans t
的实例吗?
如果没有,哪一个monad转换器(在ContT r
旁边)不能具有MonadLower
实例?
Edit: Edward Kmett定义了一个相似的类型类,称为MonadHoist
。
MonadHoist
结果是class MonadHoist t where
hoist :: (Monad m, Monad n) => (forall a. m a -> n a) -> t m a -> t n a
。
根据lower = hoist (return . runIdentity)
,我们无法为Mauro [[MonadHoist
]定义ContT
实例。
爱德华建议提出的是一类功能 monad变压器(在C类和monad态射上属于monads Mon(C)类的endofunctors的变压器)
请注意,某些转换器(例如延续monad转换器)不是函数式的。