所以我正在尝试实现这个定义:-
def validate(validationPredicates: List[A => Try[Boolean]]): Try[Boolean] = ???
它应该工作的方式如下:-
- 接受谓词
列表(每个谓词都有不同的参数,因此 A 在技术上是错误的(。
贯穿他们每个人。此处输入的方法可以返回 true、false 或引发异常。
当我们看到 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