繁体   English   中英

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

[英]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))
  }
}

每个jwvhcoll.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM