Если закодировать ваш MyError
как исключение, вы не нуждаетесь в Either
больше и может просто patternMatch против завершения, или использовать recoverWith
для отображения его на другой тип:
myType.onComplete {
case Success(t) =>
case Failure(e) =>
}
для размещения на карте существующих Either
типов вы могли бы сделать что-то вроде этого:
case class MyException(e: MyError) extends Exception
def eitherToException[A](f: Future[Either[MyError,A]]): Future[A] = {
f.flatMap {
case Left(e) => Future.failed(MyException(e))
case Right(x) => Future.successful(x)
}
}
val myType2 = eitherToException(myType)
в качестве альтернативы, если MyError
и TypeA
находятся под вашим контролем, вы можете созд ели общий супер типа и сопоставление с образцом, что:
sealed trait MyResult
final case class MyError() extends MyResult
final case class TypeA() extends MyResult
myType.map {
case MyError() => ...
case TypeA() => ...
}
Это звучит, как вам нужно монады трансформаторы, которые, к сожалению, Ядро scala не обеспечивает. Сопоставимый тип в scalaz будет «EitherT [Task, MyError, TypeA]». Вы можете делать такие операции, как 'map',' flatMap' и т. Д., Что разумно. –
Нет! использование scalaz не является вариантом для этого проекта! – sparkr
Вы не можете добавить зависимости? Думаю, вы могли бы свернуть свой «EitherT»? –