3

如何创建ArrowfromFreeMonadFree

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箭头 for 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 ...

但看起来实现并不简单

4

1 回答 1

1

如果m'是 的一个实例Monad,那么Kleisli m'Arrow(以及一堆其他相关类型类,如ArrowApply)的一个实例。

在您的情况下,您希望FreeT f m用作底层 monad(对于 some Functor fand Monad m),因此您可以设置m'FreeT f m获得您想要的内容:Kleisli (FreeT f m).

于 2016-01-06T07:32:10.213 回答