[英]Scala-Cats :- Is it possible to combine errors from different NonEmptyLists?
是否有可能使用NonEmptyList
合并来自多个变量的不同错误
type ValidationResult[A] = ValidatedNel[String, A]
def throwErrorsWhenNumberIsLessThan6(x:Int):ValidationResult[Int] = if(x<6) s"$x !> 6".invalidNel else (x+6).validNel
def throwErrorsWhenStringLengthIsLessThan6(x:String):ValidationResult[String] = if(x.length<6) s"$x length > 6".invalidNel else (x+" OK!!! ").validNel
val ints = Range.apply(1,10).map(throwErrorsWhenNumberIsLessThan6).toList
val strings = Range.apply(1,10).map(e => throwErrorsWhenStringLengthIsLessThan6(e.toString)).toList
有没有一种方法可以合并ints
和strings
可用的所有错误?
假设 ints
和strings
在NonEmptyList
具有相同的数据类型。
这对我有用
type ValidationResult[A] = ValidatedNel[String, A]
def throwErrorsWhenNumberIsLessThan6(x:Int):ValidationResult[Int] = if(x<6) s"$x !> 6".invalidNel else (x+6).validNel
def throwErrorsWhenStringLengthIsLessThan6(x:String):ValidationResult[String] = if(x.length<6) s"$x length > 6".invalidNel else (x+" OK!!! ").validNel
val ints = Range.apply(0,2).map(throwErrorsWhenNumberIsLessThan6).toList
val strings = Range.apply(0,2).map(e => throwErrorsWhenStringLengthIsLessThan6(e.toString+"KK")).toList
ints.filter(_.isInvalid).:::(strings.filter(_.isInvalid))
//List(Invalid(NonEmptyList(0KK length > 6)), Invalid(NonEmptyList(1KK length > 6)), Invalid(NonEmptyList(0 !> 6)), Invalid(NonEmptyList(1 !> 6)))
是的,您可以从Applicative
类型类中获取方法。
例如,现在您的ints
具有类型List[ValidationResult[Int]]
。 您可以使用sequence
方法将其转换为ValidationResult[List[Int]]
:
import cats.implicits._
scala> val validatedInts = ints.sequence
validatedInts: ValidationResult[List[Int]] =
Invalid(NonEmptyList(1 !> 6, 2 !> 6, 3 !> 6, 4 !> 6, 5 !> 6))
或者,在创建ints
对象以立即获取ValidationResult
时,可以使用traverse
而不是map
:
scala> val validatedInts2 = (1 until 10).toList.traverse(throwErrorsWhenNumberIsLessThan6)
validatedInts2: ValidationResult[List[Int]] =
Invalid(NonEmptyList(1 !> 6, 2 !> 6, 3 !> 6, 4 !> 6, 5 !> 6))
并对strings
执行相同的strings
:
scala> val validatedStrings = (0 until 2).toList.traverse(e =>
throwErrorsWhenStringLengthIsLessThan6(e.toString + "KK")).toList
validatedStrings: ValidationResult[List[String]] =
Invalid(NonEmptyList(0KK length > 6, 1KK length > 6))
现在,你可以结合validatedInts
和validatedStrings
成一个单一ValidationResult
与mapN
或tupled
方法:
scala> (validatedInts, validatedStrings).tupled
res0: ValidationResult[(List[Int], List[String])] =
Invalid(NonEmptyList(1 !> 6, 2 !> 6, 3 !> 6, 4 !> 6, 5 !> 6, 0KK length > 6, 1KK length > 6))
scala> (validatedInts, validatedStrings).mapN(_.map(_.toString) ++ _)
res1: ValidationResult[List[String]] =
Invalid(NonEmptyList(1 !> 6, 2 !> 6, 3 !> 6, 4 !> 6, 5 !> 6, 0KK length > 6, 1KK length > 6))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.