为什么 cats returns `Id[T]` 在评估 a Reader 时?

Why does cats returns `Id[T]` in the evaluation of a Reader?

我之前使用过 Kleisli,当您评估将依赖项传递给它的计算时,monad returns 是我需要的值。 现在我正在使用 Reader 并且我看到当我 运行 程序时,评估返回包裹在 Id.

为什么?

此外,探索 Id 我遇到的不同选项 init 解包计算值的函数。用那个"combinator"好吗? Reader 我唯一需要的是没有任何包装的生产值。

谢谢

Id 定义为 type Id[A] = A。所以它只是类型本身,您可以像没有 Id 一样使用它。

以下代码有效:

val s: Id[String] = "123"
s.charAt(s.length - 1) 

cats 文档所述:

Identity, encoded as type Id[A] = A, a convenient alias to make identity instances well-kinded.

The identity monad can be seen as the ambient monad that encodes the effect of having no effect. It is ambient in the sense that plain pure values are values of Id.

For instance, the cats.Functor instance for cats.Id allows us to apply a function A => B to an Id[A] and get an Id[B]. However, an Id[A] is the same as A, so all we're doing is applying a pure function of type A => B to a pure value of type A to get a pure value of type B. That is, the instance encodes pure unary function application.

例如,Reader定义为:

更方便
type Reader[A, B] = ReaderT[Id, A, B]
type ReaderT[F[_], A, B] = Kleisli[F, A, B]

F[_] 是真实的东西时,这允许您为更复杂的情况定义所有类型类实例,而当没有 F[_] 时,只需将这些实例用于更简单的情况(即,当 FId).