IO Monad 与 Reader Monad

IO Monad vs Reader Monad

我想知道 IO Monad 和 Reader monad 之间有什么关系吗?

Reader monad 中的环境可以产生效果吗?如果是这样,ZIO 或 Cats IO,scalaz-effects 如何处理 Reader Monad 原则?

Reader 中的环境通常不是效果 - 不需要。

要理解原因,您首先需要了解 Reader monad 是对函数 A => B 的抽象,其中 A 是某种环境。

一般来说,如果你有效果 F[A],你总是可以 map 使用 Readerapply - 函数的值,对吗?

对于 cats-effectReader 简单地定义为 Kleisli(对函数 A => F[B] 的抽象),F[_] 被定义为 type F[A] = AKleisli 提供了您在组合方面所需的一切,这就是为什么 Reader 被定义为 Kleisli 的子集的原因。您可以阅读更多相关信息 here

对于 ZIO,情况看起来有点不同。

看看定义:ZIO[R, E, A]。这三个类型参数描述了环境(R)、错误类型(E)和结果类型(A)。

这意味着 ZIO 已经是 IOReader 单子的组合。 在 ZIO 中,您可以使用 access- 函数访问环境。