Как конвертировать Option [Try [_]] в Try [Option [_]]?

Я довольно часто использую функцию ниже, чтобы конвертироватьOption[Try[_]] вTry[Option[_]] но он чувствует себя неправильно. Может ли такая функциональность быть выражена более идиоматически?

def swap[T](optTry: Option[Try[T]]): Try[Option[T]] = {
  optTry match {
    case Some(Success(t)) => Success(Some(t))
    case Some(Failure(e)) => Failure(e)
    case None => Success(None)
  }
}

Скажем, у меня есть два значения:

val v1: Int = ???
val v2: Option[Int] = ???

Я хочу сделать операциюop (который может потерпеть неудачу) на эти значения и передать его в функциюf ниже.

def op(x: Int): Try[String]
def f(x: String, y: Option[String]): Unit

Я обычно использую для понимания для удобства чтения:

for {
  opedV1 <- op(v1)
  opedV2 <- swap(v2.map(op))
} f(opedV1, opedV2)

PS. Я хотел бы избежать некоторых тяжелых вещей, таких как скалаз.

Ответы на вопрос(3)

Ваш ответ на вопрос