【问题标题】:How Do I Check If a LIst of Validation Contains At Least One Invalid?如何检查验证列表是否包含至少一个无效?
【发布时间】:2021-02-27 10:20:45
【问题描述】:

假设我有这样的类型:

val checkConstraints : List[Either[NonEmptyList[String], Valid[Data]]

如何检查此列表中是否至少有一个元素是左元素?即,当我进行验证检查时,它为 List[Data] 中的至少一个元素生成了一个 NonEmptyList。不确定这是否是检查 List[Data] 是否包含至少一个未通过验证的元素的最佳方法。我所做的是:

val result = (check(data.f1), check(data.f2)).mapN{
  case (f1, f2) =>
    Valid(Data(f1, f2))
}.toEither

我能想到一种方法:

val dd: List[Data] = result.collect { case Valid(value) => value }

if (data.size =!= dd.size) { // then I know there was at least on failure
  invalid("there is at least one data point which has failed validation")
} else {
  Valid(dd)
}

有没有更好的方法来做到这一点?

【问题讨论】:

  • 您也可以sequence 来获取列表中的任何一个。此外,右边是 Valid 的 any 感觉不正确,直接使用 Data 即可。也许您可以显示将您带到该结果的代码?您可能在某处使用了错误的方法。

标签: scala scala-cats either


【解决方案1】:

最简单的方法就是使用exists,例如:

val validations: List[Either[String, String]] = List(Left("Err"), Right("Success"))
println(validations.exists(_.isLeft))

将打印出true:

斯卡蒂:https://scastie.scala-lang.org/ZwEEVHwGRHiikLEeh1b3SQ

【讨论】:

    【解决方案2】:

    Either 是一个 monad,它对列表中的第一个 Left 值进行短路。

    因此,如果列表中至少有一个Left,则使用sequence 将产生Left,否则使用Right

    println(validations.sequence.isLeft)
    

    【讨论】:

      猜你喜欢
      • 2015-07-23
      • 1970-01-01
      • 2021-10-21
      • 2018-03-21
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 2017-06-30
      • 2013-08-11
      相关资源
      最近更新 更多