我有一个类似于List<Either<Failure, List<MyResult>>>
的列表,我想使用Arrow kt将其展平为Either<Failure, List<MyResult>>
,但我尝试的所有操作似乎都很笨拙,最终遍历了列表两次。感觉应该有更好的方法,但我想不通。下面是我现在拥有的一个人为的例子:
val things : List<MyThing> = /* some stuff */
val results : List<Either<Failure, List<MyResult>>> = things.map { doThingThatReturnsEither(it) }
val successes : List<MyResult> = results.mapNotNull { it.orNull() }.flatten()
val firstFailure : Failure? = results.mapNotNull { it.swap().orNull() }.firstOrNull()
return firstFailure?.let {it.left()} ?: success.right()
欢迎提出任何建议!
额外的问题:如果其中一个带着Left
回来,有没有办法缩短things.map { }
?
您要查找的函数是sequence
val res:Either<Failure, List<MyResult>> = results.sequence(Either.applicative())
.fix()
.map { it.fix() }
这将使第一个Failure
(如果有(短路,并将其返回为左侧,或者将所有MyResult
作为列表提供给您。
需要CCD_ 8和CCD_。