¿Cómo convertir la Opción [Probar [_]] para Probar [Opción [_]]?

A menudo uso la siguiente función para convertirOption[Try[_]] aTry[Option[_]] Pero se siente mal. ¿Puede tal funcionalidad expresarse de manera más idiomática?

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)
  }
}

Digamos que tengo dos valores:

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

Quiero hacer una operacionop (que puede fallar) en estos valores y pasarlos a funcionarf abajo.

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

Normalmente uso para la comprensión de legibilidad:

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

PD. Me gustaría evitar algunas cosas pesadas como scalaz.

Respuestas a la pregunta(3)

Su respuesta a la pregunta