Scala - есть ли функция для сопоставления Seq [A] => Seq [Either [Throwable, B]]? - PullRequest
0 голосов
/ 07 ноября 2018

Я ищу функцию, которая отобразит коллекцию 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))
  }
}

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Per jwvh : coll.map(a => Try(f(a)).toEither), кажется, самый простой / чистый способ сделать это.

0 голосов
/ 07 ноября 2018

К сожалению, я не верю, что то, что вы ищете, уже существует в точности ... Но вот общая реализация, которая делает то, что вы хотите, и, возможно, дальнейшее чтение класса типа 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))

Редактировать: разделение черты и синтаксиса не является необходимым, поэтому я удалил его

...