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] = ???
其工作原理如下:-

  • 接受一个谓词列表(每个谓词具有不同的参数,因此a在技术上是错误的)

  • 把每一个都看一遍。放在这里的方法可以返回true、false或抛出异常

  • 当我们在序列中看到false或异常时,停止对它们的运行

  • 这里还有其他一些事情(个别验证器中的其他类型的副作用,但这不会影响操作链)

    有人能告诉我如何实现接受任何输入参数但输出总是尝试[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)
      ,则
      .get
      将重新抛出外部Try捕获的异常,您将获得
      失败(e)

    这假设函数返回
    Try[Boolean]
    。如果它们只返回
    布尔值
    (如本文所述),则只需删除
    。获取


    我没有提到关于“接受任何输入参数函数的语法”的评论,因为我不知道它是什么意思,感觉像是一个单独的问题。

    我可能遗漏了一些东西,但这不只是一个问题吗

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

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

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

    这假设函数返回
    Try[Boolean]
    。如果它们只返回
    布尔值
    (如本文所述),则只需删除
    。获取


    我没有提到关于“接受任何输入参数函数的语法”的评论,因为我不知道这是什么意思,感觉像是一个单独的问题。

    我认为这很接近,但即使前面的谓词返回false,也会继续执行谓词。这可能会导致以后的副作用仍然发生,这听起来似乎是不希望的。我想你可以用
    bool=>if(bool)predicate(a)else Try(false)
    替换内部
    flatMap
    来修复它。这是foldLeft的经典问题,不能提前停止,但你的建议是一个很好的解决方法。我认为这很接近,但即使较早的一个返回false,也会继续执行谓词。这可能会导致以后的副作用仍然发生,这听起来似乎是不希望的。我认为您可以通过将内部
    flatMap
    替换为
    bool=>if(bool)谓词(a)else Try(false)
    来修复它。这是foldLeft的经典问题,不能提前停止,但您的建议是一个很好的解决方法