我正在读这篇文章
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
轻松完成。我已经验证了,我想按顺序处理它们。
答案 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)