【发布时间】:2019-10-23 08:40:54
【问题描述】:
如何使用类似于猫sequence的方法将List[Either[String, Int]]转换为Either[List[String], List[Int]]?比如下面代码中的xs.sequence
import cats.implicits._
val xs: List[Either[String, Int]] = List(Left("error1"), Left("error2"))
xs.sequence
返回 Left(error1) 而不是必需的 Left(List(error1, error2))。
KevinWrights 的answer 建议
val lefts = xs collect {case Left(x) => x }
def rights = xs collect {case Right(x) => x}
if(lefts.isEmpty) Right(rights) else Left(lefts)
确实会返回Left(List(error1, error2)),但是猫是否提供开箱即用的测序来收集所有的左侧?
【问题讨论】:
-
也许是这个:
xs.traverse(e => Validated.fromEither(e).toValidatedNec).toEither?暂时无法测试,可能有错别字。 -
@MarioGalic 几个小时前我已经在(现已删除的)cmets 中提到了建议的副本,但后来决定它并不完全相同:仍然需要
List(_)部分,我不是 100% 确定是否有一些方便的方法可以自动将元素包装到列表中。另外,我喜欢你问题的标题:这是一个非常好的规范标题!所以,我没有关闭(也因为我在用我自己的答案关闭问题的副本时犹豫不决)。我只为规范标题投票赞成。
标签: scala scala-cats