Scala 为什么猫在评估读者时返回'Id[T]'?

Scala 为什么猫在评估读者时返回'Id[T]'?,scala,functional-programming,monads,scala-cats,Scala,Functional Programming,Monads,Scala Cats,我以前使用过Kleisli,当您计算将依赖项传递给它的计算时,monad将返回我需要的值。 现在我正在使用Reader,我看到当我运行程序时,计算结果会以Id的形式返回 为什么? 另外,探索Id在使用init函数打开计算值时遇到的不同选项。使用“组合器”好吗?我从阅读器中需要的唯一东西是生成的值,而不需要任何包装 谢谢Id定义为类型Id[A]=A。因此,它只是类型本身,您可以像没有Id一样使用它 以下代码有效: val s: Id[String] = "123" s.charAt(s.lengt

我以前使用过
Kleisli
,当您计算将依赖项传递给它的计算时,monad将返回我需要的值。 现在我正在使用
Reader
,我看到当我运行程序时,计算结果会以
Id
的形式返回

为什么?

另外,探索
Id
在使用
init
函数打开计算值时遇到的不同选项。使用“组合器”好吗?我从
阅读器中需要的唯一东西是生成的值,而不需要任何包装


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

以下代码有效:

val s: Id[String] = "123"
s.charAt(s.length - 1) 
正如
cats
文档所述:

Identity,编码为
类型Id[A]=A
,是一个方便的别名,可以使Identity实例更加相似

身份单子可以看作是编码无效果效果的环境单子。纯纯值是
Id
的值,从这个意义上讲,它是环境值

例如,
cats.Id
cats.Functor
实例允许我们将函数
a=>B
应用于
Id[a]
并获得
Id[B]
。但是,
Id[A]
A
相同,所以我们所做的一切 将类型为
a=>B的纯函数应用于
键入
A
以获取类型
B
的纯值。就是这个例子 编码纯一元函数应用程序

例如,对于
Reader
来说,将其定义为:

type Reader[A, B] = ReaderT[Id, A, B]
type ReaderT[F[_], A, B] = Kleisli[F, A, B]
这允许您在
F[\u]
是真实的情况下为更复杂的情况定义所有typeclass实例,并在没有
F[\u]
的情况下(即
F
Id
时)仅将这些实例用于更简单的情况