You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kotlin Arrow库中将Either.Right的集合展平为Sequence<Either<A,B>>

实现Sequence<Either<A, List>>到Sequence<Either<A, B>>的转换

要完成这个Kotlin Sequence层面的展平转换,核心是对序列中的每个Either实例做分支处理:

  • 若为Left类型(比如示例中的Error),直接保留该Left作为结果序列的单个元素;
  • 若为Right类型(比如示例中的Person),取出内部的List<B>,将每个B元素包装为Right<B>后展开到结果序列中。

针对示例的具体实现

修正你原有的代码,正确的写法如下:

class Person(val favouriteColors: List<String> = listOf("red", "blue"))

val people: Sequence<Either<Error, Person>> = // 你的序列初始化逻辑

val result: Sequence<Either<Error, String>> = people.flatMap { eitherPerson ->
    when (eitherPerson) {
        is Either.Left -> sequenceOf(eitherPerson) // 直接传递错误
        is Either.Right -> 
            eitherPerson.value.favouriteColors.asSequence()
                .map { color -> Either.Right(color) }
    }
}

通用扩展函数(复用性更强)

如果需要在多个地方复用这个逻辑,可以封装成通用扩展函数:

fun <A, B> Sequence<Either<A, List<B>>>.flattenRightToListElements(): Sequence<Either<A, B>> {
    return flatMap { either ->
        when (either) {
            is Either.Left -> sequenceOf(either)
            is Either.Right -> either.value.asSequence().map { Either.Right(it) }
        }
    }
}

// 调用方式
val result = people.flattenRightToListElements()

关键说明

  • 这里使用的是Kotlin Sequence的flatMap,完全符合你要求的Sequence层面展平,而非Arrow库的Either操作符;
  • Arrow的Either是密封类,when表达式可以做到穷尽匹配,无需额外的else分支;
  • 对于Right中的列表,先转成Sequence再做map,能保持懒加载特性,符合Sequence的设计初衷。

内容的提问来源于stack exchange,提问作者aleks.stan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 05:05:03