[英]Scala - Is there a function to map Seq[A] => Seq[Either[Throwable, B]]?
我正在寻找一个将在集合coll: Seq[A]
映射的函数coll: Seq[A]
同时应用函数f: A => B
并返回Seq[Either[Throwable, B]]
以便可以在下游处理错误。
是否有类似的功能已预烘焙到某些库中? 也许是猫还是斯卡拉兹?
请参阅下面的实施:
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))
}
}
每个jwvh : coll.map(a => Try(f(a)).toEither)
似乎是最简单/最干净的方法。
不幸的是,我不相信您正在寻找的东西已经完全存在了……但是,这是一个通用的实现,可以满足您的需求,也许进一步阅读cats中的ApplicativeError类型类将使您更加接近
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 / _)
返回值:
res0:List [ErrorOr [Int]] = List(左(java.lang.ArithmeticException:/零),右(5),右(2),右(1),右(1))
编辑:特征和语法的分隔不是必需的,所以我删除了它
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.