我自己从书Advanced scala with cats
做了一个简单的练习。
我想将Cartesian
与Validated
一起使用。
/*
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(
^
答案 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
)。