在地图中处理 Arrow-kt Either
Handling an Arrow-kt Either inside a map
我的问题与有些相关,但也不完全是。
我有一个映射列表,在这个映射中我调用了一个 returns Either 函数。如果Either有错误,我需要马上退出。
我目前有这样的东西:
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()
我的问题与
我有一个映射列表,在这个映射中我调用了一个 returns Either 函数。如果Either有错误,我需要马上退出。
我目前有这样的东西:
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()