Scala with Cats - 笛卡尔+验证
Scala with Cats - Cartesian + Validated
我正在自己做 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(
^
如果没有看到您的导入,我猜问题是您缺少 List
(或 Vector
的 Semigroup
实例——不清楚您要使用哪个), 因为以下对我有用:
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.implicits
或 cats.instances.list
)。
我正在自己做 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(
^
如果没有看到您的导入,我猜问题是您缺少 List
(或 Vector
的 Semigroup
实例——不清楚您要使用哪个), 因为以下对我有用:
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.implicits
或 cats.instances.list
)。