2

我正在自己做一个简单的练习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( ^

4

1 回答 1

4

在没有看到您的导入的情况下,我猜问题是您缺少一个Semigroup实例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(or Vector) 的情况下,串联对于这种累积操作是有意义的,并且 CatsSemigroup为 any提供了串联List[A],但是为了将其应用到此处,您必须显式导入它( fromcats.implicits或 from cats.instances.list)。

于 2016-09-29T18:15:55.363 回答