将有状态谓词链接在一起

问题描述 投票:0回答:2

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

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

它的工作方式如下: -

  1. 接受谓词列表(每个谓词使用不同的args,因此A在技术上是错误的)。
  2. 贯穿其中的每一个。这里放置的方法可以返回true,false或抛出异常。
  3. 当我们看到一个假,或者看到序列中的异常时,停止它们中的每一个。

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

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

scala functional-programming
2个回答
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的函数的语法”这句话,因为我不知道它意味着什么,感觉就像一个单独的问题。


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

© www.soinside.com 2019 - 2024. All rights reserved.