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 для меня.

Другие вопросы по тегам