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
时)仅将这些实例用于更简单的情况