gpt4 book ai didi

scala - 将 Seq[Either[String, Int]] 转换为 (Seq[String], Seq[Int]) 的有效和/或惯用方法

转载 作者:行者123 更新时间:2023-12-04 17:53:50 27 4
gpt4 key购买 nike

稍微简化一下,我的问题来自字符串列表 input我想用函数解析 parse返回 Either[String,Int] .

然后list.map(parse)返回 Either 的列表s。程序的下一步是格式化错误消息,总结所有错误或传递解析的整数列表。

让我们调用我正在寻找的解决方案 partitionEithers .

打电话

partitionEithers(List(Left("foo"), Right(1), Left("bar")))

会给
(List("foo", "bar"),List(1))

在标准库中找到这样的东西是最好的。如果没有某种干净、惯用和有效的解决方案,那将是最好的。另外,我可以粘贴到我的项目中的某种有效的实用功能也可以。

我很困惑 these 3 earlier questions .据我所知,这些问题都不符合我的情况,但那里的一些答案似乎包含对这个问题的有效答案。

最佳答案

Scala 集合提供了一个 partition功能:

val eithers: List[Either[String, Int]] = List(Left("foo"), Right(1), Left("bar"))

eithers.partition(_.isLeft) match {
case (leftList, rightList) =>
(leftList.map(_.left.get), rightList.map(_.right.get))
}

=> res0: (List[String], List[Int]) = (List(foo, bar),List(1))

更新

如果你想把它包装在一个(甚至可能有点类型更安全的)泛型函数中:
def partitionEither[Left : ClassTag, Right : ClassTag](in: List[Either[Left, Right]]): (List[Left], List[Right]) =
in.partition(_.isLeft) match {
case (leftList, rightList) =>
(leftList.collect { case Left(l: Left) => l }, rightList.collect { case Right(r: Right) => r })
}

关于scala - 将 Seq[Either[String, Int]] 转换为 (Seq[String], Seq[Int]) 的有效和/或惯用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36553547/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com