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
使用 Reader
的 apply
- 函数的值,对吗?
对于 cats-effect
,Reader
简单地定义为 Kleisli
(对函数 A => F[B]
的抽象),F[_]
被定义为 type F[A] = A
。 Kleisli
提供了您在组合方面所需的一切,这就是为什么 Reader
被定义为 Kleisli
的子集的原因。您可以阅读更多相关信息 here。
对于 ZIO
,情况看起来有点不同。
看看定义:ZIO[R, E, A]
。这三个类型参数描述了环境(R
)、错误类型(E
)和结果类型(A
)。
这意味着 ZIO
已经是 IO
和 Reader
单子的组合。
在 ZIO
中,您可以使用 access
- 函数访问环境。
我想知道 IO Monad 和 Reader monad 之间有什么关系吗?
Reader monad 中的环境可以产生效果吗?如果是这样,ZIO 或 Cats IO,scalaz-effects 如何处理 Reader Monad 原则?
Reader
中的环境通常不是效果 - 不需要。
要理解原因,您首先需要了解 Reader
monad 是对函数 A => B
的抽象,其中 A
是某种环境。
一般来说,如果你有效果 F[A]
,你总是可以 map
使用 Reader
的 apply
- 函数的值,对吗?
对于 cats-effect
,Reader
简单地定义为 Kleisli
(对函数 A => F[B]
的抽象),F[_]
被定义为 type F[A] = A
。 Kleisli
提供了您在组合方面所需的一切,这就是为什么 Reader
被定义为 Kleisli
的子集的原因。您可以阅读更多相关信息 here。
对于 ZIO
,情况看起来有点不同。
看看定义:ZIO[R, E, A]
。这三个类型参数描述了环境(R
)、错误类型(E
)和结果类型(A
)。
这意味着 ZIO
已经是 IO
和 Reader
单子的组合。
在 ZIO
中,您可以使用 access
- 函数访问环境。