为什么 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[_]
时,只需将这些实例用于更简单的情况(即,当 F
是 Id
).
我之前使用过 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 forcats.Id
allows us to apply a functionA => B
to anId[A]
and get anId[B]
. However, anId[A]
is the same asA
, so all we're doing is applying a pure function of typeA => B
to a pure value of typeA
to get a pure value of typeB
. 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[_]
时,只需将这些实例用于更简单的情况(即,当 F
是 Id
).