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))
编辑:特征和语法的分离不是必需的,所以我删除了它
根据 jwvh:coll.map(a => Try(f(a)).toEither)
似乎是 simplest/cleanest 实现此目的的方法。
我正在寻找一个可以在应用函数 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))
编辑:特征和语法的分离不是必需的,所以我删除了它
根据 jwvh:coll.map(a => Try(f(a)).toEither)
似乎是 simplest/cleanest 实现此目的的方法。