所以我试图实现这个定义: -
def validate(validationPredicates: List[A => Try[Boolean]]): Try[Boolean] = ???
它的工作方式如下: -
接受谓词列表(每个谓词使用不同的args,因此A在技术上是错误的。)
贯穿其中每一个。这里放置的方法可以返回true,false或抛出异常。
当我们看到错误或在序列中看到异常时,停止运行它们。
此处还有其他事情(个别验证器中存在其他类型的副作用,但这不会影响操作链)。
有人可以告诉我如何实现链和接受任何输入参数的函数的语法,但输出总是尝试[布尔]?
答案 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的函数的语法”这句话,因为我不知道它的含义,感觉就像一个单独的问题。