如何从ArrowFree创建MonadFree

class (Functor f, Monad m) => MonadFree f m where ...

data Free f a = Impure (f (Free f a)) | Pure a

MonadFree包含2个参数mf,但是Kleisli没有空格可插入f,因此我们不能将Kleisli箭头用于MonadFree

据我了解,需要创建一个类,一个新类型和一个实例,如下所示:
class Arrow a => ArrowFunctor f a | a -> f where
    afmap :: a b (f c)

newtype FKleisli f m a b = FKleisli { runFKleisli :: a -> f (m b) }

instance (Functor f, Monad m, MonadFree f m) =>
         ArrowFunctor (FKleisli f m a) where ...

但是看起来实现并不简单

最佳答案

如果m'Monad的实例,则Kleisli m'Arrow(以及其他一系列相关的类型类,例如ArrowApply)的实例。

在您的情况下,您想将FreeT f m用作基础monad(对于某些Functor fMonad m),因此您只需将m'设置为FreeT f m即可获得所需的确切内容:Kleisli (FreeT f m)

10-07 15:36