链接猫用andThen验证

时间:2017-04-20 14:38:07

标签: scala scala-cats

我正在读这篇文章

http://typelevel.org/cats/datatypes/validated.html

它表示Validated可用于使用"然后"进行顺序验证。方法。这意味着我们在第一个错误处停止并且不收集所有错误。

我尝试了以下代码

@ val x = 123.valid[String]
x: Validated[String, Int] = Valid(123)

@ val y = "foo".invalid[Int]
y: Validated[String, Int] = Invalid("foo")

@ x andThen y
cmd4.sc:1: type mismatch;
 found   : cats.data.Validated[String,Int]
 required: Int => cats.data.Validated[?,?]
val res4 = x andThen y
                     ^

购买为什么类型不匹配。正如你所看到的,x和y都具有相同的形状。

编辑:请注意,我不想收集所有错误。我可以使用x |@| y轻松完成。我已经验证了,我想按顺序处理它们。

1 个答案:

答案 0 :(得分:1)

行。我想通过查看this answer找到了答案。使用andthen方法链接Validation monad。你需要一个函数,它取第一个Validated的右侧,然后创建另一个验证的。

所以正确的代码是

@ val x = 123.valid[String]
val y = x: Validated[String, Int] = Valid(123)

@ val y = 234.valid[String]
y: Validated[String, Int] = Valid(234)

@ val foo = (i: Int) => y
foo: Int => Validated[String, Int] = $sess.cmd4$$$Lambda$2259/7469297@25f7739c

@ x andThen foo
res5: Validated[String, Int] = Valid(234)