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