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

时间:2018-11-07 17:59:11

标签: scala scalaz scala-cats map-function either

我正在寻找一个将映射到集合group.grouper.names Out[96]: ['col_1', 'col_2'] 的函数,同时应用函数coll: Seq[A]并返回f: A => B,以便可以在下游处理错误。

是否存在与此类似的功能,并且该功能已预先烘焙到某些库中?也许是猫还是斯卡拉兹?

请在下面查看我的实现

Seq[Either[Throwable, B]]

2 个答案:

答案 0 :(得分:2)

jwvhcoll.map(a => Try(f(a)).toEither)似乎是最简单/最干净的方法。

答案 1 :(得分:0)

不幸的是,我不认为您正在寻找的东西已经完全存在了……但是这是一个通用的实现,可以满足您的需求,也许进一步阅读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(Left(java.lang.ArithmeticException:/   零),Right(5),Right(2),Right(1),Right(1))

编辑:不需要将特征和语法分开,所以我将其删除