在地图中处理 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()