使用 andThen 验证的链接猫

Chaining Cats Validated with andThen

我正在阅读这篇文章

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

它说 Validated 可用于使用 "andThen" 方法进行顺序验证。这意味着我们在第一个错误处停止,而不是收集所有错误。

我尝试了以下代码

@ 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 轻松完成。我已验证,我想按顺序处理它们。

好的。我想我通过查看 here 找到了答案。使用 andthen 方法链接验证单子。您需要一个函数,它接受第一个验证的右侧,然后创建另一个验证。

所以正确的代码是

@ 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$$$Lambda59/7469297@25f7739c

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