我有很多返回布尔值的验证方法。今天错误处理是通过对这些布尔值进行if / else来完成的。
我试图通过使用Cats Validated Monad来删除这个嵌套的if / else。
在每个返回布尔值的地方,我想将其转换为验证[List [String],Unit]
我写了这段代码
val check1 = doCheck(...).valid[List[String]].ensure{
logStuff(...)
List("wrong")
}(_ == true)
这给了我Validated [List [String],Boolean]的数据类型但是我想要Validated [List [String],Unit]
我试过
val check1 = doCheck(...).invalid[Unit].ensure{
logStuff(...)
List("wrong")
}(_ == true)
现在check1的数据类型是Validated [Any,Unit]
如何在不编写明确的if / else语句的情况下获取我想要的数据类型。
答案 0 :(得分:0)
快速解决方案是使用map
:
val check1: Validated[List[String], Unit] =
doCheck("...").valid.ensure {
logStuff("...")
List("wrong")
}(identity).map(_ => ())
另一个解决方案(我的假设是doCheck
接受String
值,要在此示例中进行验证),可以是:
val check1: Validated[List[String], Unit] =
"...".valid.ensure {
logStuff("...")
List("wrong")
}(doCheck).map(_ => ())
或者您可以使用mouse:
import mouse.all._
implicit class PimpedBoolean (b: Boolean) {
def ensure[T](l: => T): Validated[T, Unit] =
b.either(l, ()).toValidated
}
val check1: Validated[List[String], Unit] =
doCheck("...").ensure {
logStuff("...")
List("wrong")
}