Scala - 是否有映射 Seq[A] => Seq[Either[Throwable, B]] 的函数?

Scala - Is there a function to map Seq[A] => Seq[Either[Throwable, B]]?

我正在寻找一个可以在应用函数 f: A => B 并返回 Seq[Either[Throwable, B]] 时映射到集合 coll: Seq[A] 的函数,以便可以在下游处理错误。

是否有与此类似的函数预烘焙到某个库中?也许是 Cats 或 Scalaz?

查看下面我的实现:

import cats.syntax.either._

def eitherMap[A,B](f: A => B, coll: Seq[A]): Seq[Either[Throwable, B]] = {
  coll.map { elem => 
      Either.catchNonFatal(f(elem))
  }
}

不幸的是,我不相信你正在寻找的东西已经完全存在......但这是一个通用的实现,它可以做你想要的,也许进一步阅读 ApplicativeError 类型 class in cats 会给你更近的东西

type ErrorOr[A] = Either[Throwable, A]

object MapAttempt {
  implicit class MapAttemptOps[A, F[_] : Functor](fa: F[A]) {
    def mapAttempt[B, G[_]](f: A => B)(implicit appErr: ApplicativeError[G, Throwable]): F[G[B]] =
      fa.map(a => appErr.catchNonFatal(f(a)))
  }
}

import MapAttempt._

List(0, 1, 2, 3, 4).mapAttempt[Int, ErrorOr](5 / _)    

Returns:

res0: List[ErrorOr[Int]] = List(Left(java.lang.ArithmeticException: / by zero), Right(5), Right(2), Right(1), Right(1))

编辑:特征和语法的分离不是必需的,所以我删除了它

根据 jwvhcoll.map(a => Try(f(a)).toEither) 似乎是 simplest/cleanest 实现此目的的方法。