Spesso uso la funzione qui sotto per convertire Option[Try[_]]
in Try[Option[_]]
ma sembra sbagliato. Può essere una tale funzionalità espressa in modo più idiomatico?Come convertire l'opzione [Prova [_]] per provare [Opzione [_]]?
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)
}
}
Dire che ho due valori:
val v1: Int = ???
val v2: Option[Int] = ???
Voglio fare un'operazione op
(che può fallire) su questi valori e passare che a funzionare f
sotto.
def op(x: Int): Try[String]
def f(x: String, y: Option[String]): Unit
Io di solito uso di comprensione per migliorare la leggibilità:
for {
opedV1 <- op(v1)
opedV2 <- swap(v2.map(op))
} f(opedV1, opedV2)
PS. Mi piacerebbe evitare alcune cose pesanti come lo scalaz.
La definizione di 'swap' sembra ragionevole. Non sono sicuro di cosa si possa desiderare di più. –
Un pensiero: questa operazione è solitamente (idiomaticamente?) Chiamata 'sequenza' piuttosto che' scambio '. –