cats.data.EitherT с траверсой
У меня есть вопрос об использовании Traverse вместе с EitherT. Допустим, у нас есть такой код:
def validate(s: String): EitherT[Future, NumberFormatException, Int] = {
EitherT(Future.successful(try { Right(s.toInt) } catch { case e:
NumberFormatException => Left(e)}))
}
List("1", "2").traverse(validate)
К сожалению, этот код не компилируется, потому что нам чего-то не хватает:
error: could not find implicit value for evidence parameter of type cats.Applicative[G] List("1", "2").traverse(validate)
Я попытался найти это и нашел, например, такой ответ: переключение между EitherT и Validation для накопления ошибки или обхода или проверки по сравнению с дизъюнкцией
Так что, похоже, какое-то решение могло бы существовать. Но проблема в том, что они оба используют traverseU, который больше не поддерживается в scala 2.12. Так как это можно сделать, пожалуйста?
РЕДАКТИРОВАТЬ Это код, включая импорт:
import cats.data.EitherT
import cats.syntax.traverse._
import cats.instances.list._
import cats.instances.future._
import scala.concurrent.ExecutionContext.global
import scala.concurrent.Future
def validate(s: String): EitherT[Future, NumberFormatException, Int] = {
EitherT(Future.successful(try { Right(s.toInt) } catch { case e:
NumberFormatException => Left(e)}))
}
List("1", "2").traverse(validate)
2 ответа
import cats.{Applicative, Monad}
import cats.data.EitherT
import cats.syntax.traverse._
import cats.instances.list._
import cats.instances.future._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future
def validate(s: String): EitherT[Future, NumberFormatException, Int] = {
EitherT(Future.successful(try { Right(s.toInt) } catch { case e: NumberFormatException => Left(e) }))
}
type Tmp[T] = EitherT[Future, NumberFormatException,T]
List("1", "2").traverse[Tmp, Int](validate)
Так вот как это работает для меня. Я должен был создать новый тип.
Обычно кошки будут упаковывать конкретные доказательства при различных импортах. В этом случае вам нужны доказательства для List
а также Future
,
import cats.data.EitherT
import cats.syntax.traverse._
import cats.instances.list._
import cats.instances.future._
import scala.concurrent.Future
def validate(s: String): EitherT[Future, NumberFormatException, Int] = {
EitherT(Future.successful(try { Right(s.toInt) } catch { case e: NumberFormatException => Left(e) }))
}
List("1", "2").traverse(validate)
Этот код компилируется с котами 1.2.0 для меня.