Traverse[F]
определяется как класс типов для типа с одним параметром типа F[T]
. Тип Either
имеет два параметра типа, поэтому Scala не может применить преобразование к Traverse.Ops
для использования методов синтаксиса обхода для объектов, определенных с типом Either
.
Чтобы сделать их доступными, вы можете определить псевдоним типа для Either
, который фиксирует значение параметра первого типа и, таким образом, имеет только один параметр типа. Затем Scala сможет использовать синтаксис обхода для переменных, определенных с псевдонимом этого типа:
type StringOr[T] = Either[String, T]
val e: StringOr[IO[Int]] = Right(IO(2))
e.sequence
Другой метод заключается в получении экземпляра Traverse
для вашего типа с использованием типа lambdas или плагина компилятора типа , а затем вызове для него sequence
метода, передавшего ваше значение:
val e: Either[String, IO[Int]] = Right(IO(2))
// With type lambda
Traverse[({ type L[T] = Either[String, T] })#L].sequence(e)
// With kind projector
Traverse[Either[String, ?]].sequence(e)