Scala with Cats - 笛卡尔+验证

Scala with Cats - Cartesian + Validated

我正在自己做 Advanced scala with cats 书中的一个简单练习。

我想将 CartesianValidated 一起使用。

/*
this works
*/
type ValidatedString =  Validated[ Vector[String], String]
Cartesian[ValidatedString].product(
  "a".valid[Vector[String]],
  "b".valid[Vector[String]]
)

/* this doesnt work*/
type Result[A] = Validated[List[String], A]
Cartesian[ValidatedString].product(
    f(somevariable)//returns Result[String],
    g(somevariable)//returns Result[Int],
).map(User.tupled) // creates an user from the returned string, int

我完全没有头绪。有什么提示吗? 我得到:

could not find implicit value for parameter instance: cats.Cartesian[Result] Cartesian[Result].product( ^

如果没有看到您的导入,我猜问题是您缺少 List(或 VectorSemigroup 实例——不清楚您要使用哪个), 因为以下对我有用:

import cats.Cartesian, cats.data.Validated, cats.implicits._

type Result[A] = Validated[List[String], A]

Cartesian[Result].product(
  "a".valid[List[String]],
  "a".valid[List[String]]
)

您可以将 cats.implicits._ 部分替换为以下内容:

import cats.instances.list._
import cats.syntax.validated._

…但我建议从 cats.implicits._.

开始

这里的问题是,当您将两个实例与 product 组合时,Validated 会累积失败,而 "accumulates" 在特定上下文中的含义由 Semigroup 决定无效类型的实例,告诉您如何 "add" 两个无效值在一起。

List(或Vector)的情况下,拼接对于这个累加操作是有意义的,Cats为任何List[A]提供了拼接Semigroup,但是为了让它在此处应用,您必须显式导入它(来自 cats.implicitscats.instances.list)。