如何创建Arrow
fromFree
和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
箭头 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 ...
但看起来实现并不简单