Да, для этого вы можете использовать методы из класса типов 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))
Или вы можете использовать traverse
вместо map
при создании объекта ints
для получения ValidationResult
немедленно:
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
:
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))