如何从Arrow
和Free
创建MonadFree
?
class (Functor f, Monad m) => MonadFree f m where ...
data Free f a = Impure (f (Free f a)) | Pure a
MonadFree包含2个参数
m
和f
,但是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 f
和Monad m
),因此您只需将m'
设置为FreeT f m
即可获得所需的确切内容:Kleisli (FreeT f m)
。