在地图内处理箭头kt



我的问题在某种程度上与Kotlin arrow kt Flatten nested Eather有关,但也不完全相关。

我有一个映射通过的列表,在这个映射中我调用一个函数,该函数返回一个"要么"。如果非此即彼包含错误,我需要立即退出。

我现在有这样的东西:

fun doSomethingWithUsers(userList: List<User>): Either<SomethingBadException, List<User>> =
userList
.map {
if (!isAlreadyProcessed(it)) {
processUser(it.userId).fold(
ifLeft = { 
somethingBadException -> return@doSomethingWithUsers Either.Left(somethingBadException) 
},
ifRight = { processedUser ->
User.createUser(processedUser)
}
)
} else it
}.let { Either.Right(it) }

return@的替代品吗?有没有更好更地道的方法来做这件事?

我目前使用的是arrow kt的v0.8.2,但我可能可以更新到1.0.1

谢谢。

您可以使用traverseEither来实现这一点。

fun processUser(user: User): Either<Error, User> = TODO()
val list: List<User> = TODO()
list.traverseEither { processUser(it) } // Either<Error, List<User>>

对于较旧的箭头版本,请尝试:

list.traverse(Either.applicative(), { processUser(it) }).fix()

相关内容

  • 没有找到相关文章

最新更新