Scala 将有状态谓词链接在一起
因此,我试图实现这一定义:-Scala 将有状态谓词链接在一起,scala,functional-programming,Scala,Functional Programming,因此,我试图实现这一定义:- def validate(validationPredicates: List[A => Try[Boolean]]): Try[Boolean] = ??? 其工作原理如下:- 接受一个谓词列表(每个谓词具有不同的参数,因此a在技术上是错误的) 把每一个都看一遍。放在这里的方法可以返回true、false或抛出异常 当我们在序列中看到false或异常时,停止对它们的运行 这里还有其他一些事情(个别验证器中的其他类型的副作用,但这不会影响操作链) 有人能告
def validate(validationPredicates: List[A => Try[Boolean]]): Try[Boolean] = ???
其工作原理如下:-
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))
)
在cats世界中,您正在寻找遍历
在猫的世界里,你们正在寻找遍历,我可能遗漏了一些东西,但这不只是
Try(validationPredicates.forall(_(a).get))
- 如果所有谓词都返回
您将获得Success(true)
Success(true)
- 如果任何谓词返回
,您将获得Success(false)
,并且不再测试任何谓词Success(false)
- 如果任何谓词返回
,则失败(e)
将重新抛出外部Try捕获的异常,您将获得.get
失败(e)
Try[Boolean]
。如果它们只返回布尔值
(如本文所述),则只需删除。获取
我没有提到关于“接受任何输入参数函数的语法”的评论,因为我不知道它是什么意思,感觉像是一个单独的问题。我可能遗漏了一些东西,但这不只是一个问题吗
Try(validationPredicates.forall(_(a).get))
- 如果所有谓词都返回
您将获得Success(true)
Success(true)
- 如果任何谓词返回
,您将获得Success(false)
,并且不再测试任何谓词Success(false)
- 如果任何谓词返回
,则失败(e)
将重新抛出外部Try捕获的异常,您将获得.get
失败(e)
Try[Boolean]
。如果它们只返回布尔值
(如本文所述),则只需删除。获取
我没有提到关于“接受任何输入参数函数的语法”的评论,因为我不知道这是什么意思,感觉像是一个单独的问题。我认为这很接近,但即使前面的谓词返回false,也会继续执行谓词。这可能会导致以后的副作用仍然发生,这听起来似乎是不希望的。我想你可以用
bool=>if(bool)predicate(a)else Try(false)
替换内部flatMap
来修复它。这是foldLeft的经典问题,不能提前停止,但你的建议是一个很好的解决方法。我认为这很接近,但即使较早的一个返回false,也会继续执行谓词。这可能会导致以后的副作用仍然发生,这听起来似乎是不希望的。我认为您可以通过将内部flatMap
替换为bool=>if(bool)谓词(a)else Try(false)
来修复它。这是foldLeft的经典问题,不能提前停止,但您的建议是一个很好的解决方法