为什么猫在 Reader 的评估中返回 `Id[T]`?

4
我以前使用过Kleisli,当您将依赖项传递给它并评估计算时,单子会返回我需要的值。现在我正在使用Reader,我发现当我运行程序时,计算结果被包装在Id中返回。
为什么?
此外,探索Id不同的选项时,我遇到了init函数,该函数取消包装计算出的值。使用那个“组合器”好吗?我从Reader中唯一需要的是产生的值而没有任何包装器。
谢谢
1个回答

4

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

以下代码是有效的:

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

cats 文档所述:

身份,表示为 type Id[A] = A,是一种方便的别名,可以使身份实例成为良好类型。

身份单子可以看作是编码没有效应的效应的环境单子。这是因为纯粹的值是 Id 的值。

例如,对于 cats.Idcats.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]

这使您能够为更复杂的情况定义所有的typeclass实例,当F[_]是真实存在的时候,并且只需使用这些实例来处理更简单的情况,即没有F[_](即当FId)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接