Scala with Cats - 笛卡儿+验证

时间:2016-09-29 16:14:52

标签: scala scala-cats

我自己从书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( ^

1 个答案:

答案 0 :(得分:4)

如果没有看到您的导入,我猜您的问题就是您错过Semigroup的{​​{1}}个实例(或List - 您不清楚要使用哪个实例),因为以下对我有用:

Vector

您可以使用以下内容替换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._在将两个实例与Validated组合时会累积失败,并且在特定上下文中“累积”意味着由product实例确定无效类型,告诉您如何将两个无效值“添加”在一起。

对于Semigroup(或List),连接对此累积操作有意义,而Cats为任何Vector提供连接Semigroup,但是按顺序要在此处应用它,您必须明确导入它(从List[A]或从cats.implicits)。