将有状态谓词链接在一起



所以我正在尝试实现这个定义:-

 def validate(validationPredicates: List[A => Try[Boolean]]): Try[Boolean] = ???

它应该工作的方式如下:-

    接受谓词
  1. 列表(每个谓词都有不同的参数,因此 A 在技术上是错误的(。

  2. 贯穿他们每个人。此处输入的方法可以返回 true、false 或引发异常。

  3. 当我们看到 false 或在序列中看到异常时,停止运行它们中的每一个。

这里还有其他事情发生(单个验证器中的其他类型的副作用,但这不会影响操作链(。

有人可以告诉我如何实现链和语法以接受任何输入参数的函数,但输出总是 Try[布尔]?

我可能错过了一些东西,但这不就是

Try(validationPredicates.forall(_(a).get))
  • 如果所有谓词都返回Success(true)则得到Success(true)

  • 如果任何谓词返回Success(false)您将得到Success(false),并且不会再测试谓词

  • 如果任何谓词返回Failed(e).get将重新抛出被外部 Try 捕获的异常,您将获得Failed(e)

这假定函数返回Try[Boolean] 。如果他们只是返回Boolean(如文本中所述(,则只需删除.get

我没有解决关于"接受任何输入参数函数的语法"的评论,因为我不知道它是什么意思,感觉像是一个单独的问题。

  def validate[A](validationPredicates: List[A => Try[Boolean]]): A => Try[Boolean] =
    (a: A) => validationPredicates.foldLeft(Try(true))(
        (state, predicate) => state.flatMap(bool => predicate(a).map(_ && bool))
      )

在猫的世界里,你正在寻找traverse

最新更新