2016-09-29 90 views
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( ^

+0

在你的第一个例子中,你可以用'Vector []'定义'ValidatedString',而在第二个例子中,你可以用'List []'来定义它。这是真正的区别吗? –

+0

这是一个小问题,但是您的第一个代码片段_doesn't_实际上并不工作,因为'ValidatedString'不是一个类型构造函数。这将使这个问题对未来的读者更有用,以确保您的代码被正确描述。 –

回答

4

没有看到你的进口我猜的问题是您遗漏了List一个Semigroup实例(或Vector要使用 - 它并不清楚),因为以下为我工作:

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

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._部分

...但我建议从cats.implicits._开始。

这里的问题是,Validated累积失败当你把两个实例与product,以及什么是“积累”,在特定情况下是指由Semigroup实例为无效的类型,它告诉你如何“添加”两无效的决定值一起。

List(或Vector)的情况下,串联是有道理的,这种积累操作和猫提供串联Semigroup任何List[A],但为了得到它的应用在这里你必须明确地导入(无论是从cats.implicits或从cats.instances.list)。

+0

我缺少'import cats.implicits._' 谢谢! –