【发布时间】:2019-12-07 09:26:39
【问题描述】:
假设我们有以下类型类。
class MonadTrans t => MonadLower t where
lower :: Monad m => t Identity a -> t m a
作为一个简单的例子,我们可以为MaybeT 实现一个MonadLower 的实例,如下所示。
instance MonadLower MaybeT where
lower (MaybeT (Identity maybe)) = MaybeT (return maybe)
但是,我不知道如何为ContT r 实现MonadLower 的实例。
instance MonadLower (ContT r) where
lower (ContT f) = ContT $ \k -> ???
甚至可以为每个MonadTrans t 创建一个MonadLower t 的实例吗?
如果没有,哪些 monad 转换器(除了 ContT r)不能有 MonadLower 实例?
编辑:Edward Kmett 定义了一个类似的类型类,称为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)。
【问题讨论】:
-
lower只是fmap (pure . runIdentity)吗?我在这里错过了什么? -
@amalloy
ContT r Identity a是(a -> Identity r) -> Identity r。因此,fmap不起作用。 -
@amalloy 原来
lower是hoist (pure . runIdentity),其中hoist是Edward Kmett在他的MonadHoist类中定义的一个函数。
标签: haskell monads monad-transformers