0

我的问题与Kotlin arrow-kt Flatten nested Either有点相关,但也不完全是。

我有一个要映射的列表,在这个映射中我调用了一个返回 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@?有没有更好的更惯用的方法来做到这一点?

我目前正在使用 v0.8.2 的 arrow-kt ,但我可能能够更新到 1.0.1

谢谢你。

4

1 回答 1

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()
于 2022-01-27T22:41:08.087 回答