如何从 Free
和 MonadFree
创建一个 Arrow
?
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
,所以我们不能为 MonadFree
使用 Kleisli
箭头。
据我了解,需要创建一个类、一个新类型和一个实例,如下所示:
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)
。
关于haskell - 来自 Free 和 MonadFree 的箭头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18932128/