将布尔值转换为验证[List [String],Unit]

时间:2017-04-18 21:34:22

标签: scala scala-cats

我有很多返回布尔值的验证方法。今天错误处理是通过对这些布尔值进行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语句的情况下获取我想要的数据类型。

1 个答案:

答案 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")
  }