我遇到了下面的通用函数,它接受两种Either
类型和一个函数作为参数。如果两个参数都Either.Right
对它应用函数并返回结果,如果任何一个参数是Either.Left
它返回 NonEmptyList(Either.Left)。基本上它执行独立操作并累积错误。
fun <T, E, A, B> constructFromParts(a: Either<E, A>, b: Either<E, B>, fn: (Tuple2<A, B>) -> T): Either<Nel<E>, T> {
val va = Validated.fromEither(a).toValidatedNel()
val vb = Validated.fromEither(b).toValidatedNel()
return Validated.applicative<Nel<E>>(NonEmptyList.semigroup()).map(va, vb, fn).fix().toEither()
}
val error1:Either<String, Int> = "error 1".left()
val error2:Either<String, Int> = "error 2".left()
val valid:Either<Nel<String>, Int> = constructFromParts(
error1,
error2
){(a, b) -> a+b}
fun main() {
when(valid){
is Either.Right -> println(valid.b)
is Either.Left -> println(valid.a.all)
}
}
上面的代码打印
[error 1, error 2]
在函数内部,它将 Either 转换为 ValidatedNel 类型并累积两个错误 ( Invalid(e=NonEmptyList(all=[error 1])) Invalid(e=NonEmptyList(all=[error 2])) )
我的问题是它如何执行此操作,或者任何人都可以从代码中解释以下行。
return Validated.applicative<Nel<E>>(NonEmptyList.semigroup()).map(va, vb, fn).fix().toEither()