Wie konvertiere ich Option [Try [_]] in Try [Option [_]]?

Ich benutze die folgende Funktion ziemlich oft, um @ zu konvertierOption[Try[_]] zuTry[Option[_]] aber es fühlt sich falsch an. Kann eine solche Funktionalität auf mehr idiomatische Weise ausgedrückt werden?

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

Sag ich habe zwei Werte:

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

Ich möchte eine Operation durchführenop (was fehlschlagen kann) auf diesen Werten und übergebe das an functionf unten.

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

Ich benutze normalerweise zum Verständnis für die Lesbarkeit:

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

PS. Ich möchte einige schwere Sachen wie Scalaz vermeiden.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage