List [EitherT [Future, String, CustomObj]] => EitherT [Future, String, List [CustomObj]] - PullRequest
0 голосов
/ 20 ноября 2018

Как использовать функцию sequence для List [EitherT [Future, String, CustomObj]] с пользовательским классом CustomObj?Я хочу что-то вроде этого:

import scala.language.postfixOps
import cats.instances.list._
import cats.syntax.traverse._
import cats.data.EitherT
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

case class CustomObj(int: Int)

private val fst: EitherT[Future, String, CustomObj] =
  EitherT.pure[Future, String](CustomObj(1))
private val snd: EitherT[Future, String, CustomObj] =
  EitherT.pure[Future, String](CustomObj(2))

val source: List[EitherT[Future, String, CustomObj]] = fst :: snd :: Nil

val result: EitherT[Future, String, List[CustomObj]] = source.sequence

import scala.concurrent.duration._
val res = scala.concurrent.Await.result(result.value, 1 second)
println(res) // Right(List(CustomObj(1), CustomObj(2)))

Каждый раз во время компиляции я получаю

 error: Cannot prove that EitherT[Future,String,CustomObj] <:< G[A].

Что это значит <: <G [A]? </p>

1 Ответ

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

Это отредактированная версия, код @ https://scastie.scala -lang.org / Yaneeve / Jro89ZHwS3G23Aveanxc5A :

import scala.language.postfixOps
import cats.implicits._
import cats.data.EitherT
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

case class CustomObj(int: Int)

private val fst: EitherT[Future, String, CustomObj] =
  EitherT.pure[Future, String](CustomObj(1))
private val snd: EitherT[Future, String, CustomObj] =
  EitherT.pure[Future, String](CustomObj(2))

val source: List[EitherT[Future, String, CustomObj]] = fst :: snd :: Nil

val result: EitherT[Future, String, List[CustomObj]] = source.sequence

import scala.concurrent.duration._
val res = scala.concurrent.Await.result(result.value, 1 second)
println(res) // Right(List(CustomObj(1), CustomObj(2)))

Изначально я написал:

Обратите внимание, что он не компилировался и генерировал странные сообщения компиляции, пока я не добавил import scala.concurrent.ExecutionContext.Implicits.global

И это верно, НО ваша проблема сделалане ври там.Когда я пошел воспроизводить снова, я получил ошибку, которую вы указали.Отсутствует флаг SBT / scalac: scalacOptions += "-Ypartial-unification"

...