将有状态谓词链接在一起

时间:2018-03-05 22:55:57

标签: scala functional-programming

所以我试图实现这个定义: -

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

它的工作方式如下: -

  1. 接受谓词列表(每个谓词使用不同的args,因此A在技术上是错误的。)

  2. 贯穿其中每一个。这里放置的方法可以返回true,false或抛出异常。

  3. 当我们看到错误或在序列中看到异常时,停止运行它们。

  4. 此处还有其他事情(个别验证器中存在其他类型的副作用,但这不会影响操作链)。

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

2 个答案:

答案 0 :(得分:2)

  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

答案 1 :(得分:2)

我可能会遗漏一些东西,但这不仅仅是

Try(validationPredicates.forall(_(a).get))
  • 如果所有谓词都返回Success(true),您将获得Success(true)

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

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

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

我没有谈到关于“接受任何输入args的函数的语法”这句话,因为我不知道它的含义,感觉就像一个单独的问题。