К сожалению, я не верю, что то, что вы ищете, уже существует в точности ... Но вот общая реализация, которая делает то, что вы хотите, и, возможно, дальнейшее чтение класса типа 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: Список [ErrorOr [Int]] = Список (Слева (java.lang.ArithmeticException: /
ноль), справа (5), справа (2), справа (1), справа (1))
Редактировать: разделение черты и синтаксиса не является необходимым, поэтому я удалил его