haskell - 来自 Free 和 MonadFree 的箭头

标签 haskell monads arrows free-monad

如何从 FreeMonadFree 创建一个 Arrow

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,所以我们不能为 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 fMonad m),所以你只需将 m' 设置为 FreeT f m 即可得到您想要的:Kleisli (FreeT f m)

关于haskell - 来自 Free 和 MonadFree 的箭头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18932128/

相关文章:

haskell - 相当于箭头表示法中的遍历

jquery - Fancybox - 将上一个/下一个箭头保留在同一位置

haskell - 基于交互式(GHCi)或编译的条件编译

haskell - 模式匹配元组不是完全惰性的吗?

haskell - 为什么这个实现是可折叠类型类的错误实例?

haskell - 如何将绑定(bind)与嵌套的单子(monad)一起使用?

generics - Haskell 中的泛型类型转换

不推荐使用 Scala 错误函数。什么是替代方案?

haskell - IO 是免费的 Monad 吗?

haskell - 写一个Monad Transformer,真的需要这么多硬编码的实例吗