是否可以为每个monad转换器`t`写出类型为`Monad m => t Identity a-> t m a`的函数?

问题描述 投票:1回答:1

假设我们具有以下类型类。

class MonadTrans t => MonadLower t where
    lower :: Monad m => t Identity a -> t m a

作为一个简单的例子,我们可以如下实现MonadLowerMaybeT实例。

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

haskell monads monad-transformers
1个回答
0
投票

根据lower = hoist (return . runIdentity),我们无法为Mauro [[MonadHoist]定义ContT实例。

爱德华建议提出的是一类功能 monad变压器(在C类和monad态射上属于monads Mon(C)类的endofunctors的变压​​器)

请注意,某些转换器(例如延续monad转换器)不是函数式的。

© www.soinside.com 2019 - 2024. All rights reserved.