如何转换
val source: Map[MyKeyType, ValidationNel[MyErrorType, MyValueType]]
到
val target: ValidationNel[MyErrorType, Map[MyKeyType, MyValueType]]
同时捕获所有验证错误?
最佳答案
您可以使用 sequence
将类型 F[G[A]]
由内而外(即,变成 G[F[A]]
) 如果你有两个东西:G
的 Applicative
实例和 F
的 Traverse
实例。在这种情况下,Scalaz 提供了现成的两种方法,因此您只需编写 source.sequenceU
(其中 U
部分表示这是一个使用 Unapply 的方法
帮助 Scala 的类型推断系统的技巧。
例如:
scala> println(Map("a" -> 1.successNel, "b" -> 2.successNel).sequenceU)
Success(Map(a -> 1, b -> 2))
scala> println(Map("a" -> 1.successNel, "b" -> "BAD".failureNel).sequenceU)
Failure(NonEmptyList(BAD))
错误会按预期累积。
关于Scalaz:ValidationNel 的映射到 Map 的 ValidationNel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26851165/