Как я могу (лучше всего) преобразовать Опцию, возвращенную вызовом метода, в Try (по предпочтению, хотя Либо или сказус \/
, или даже Проверка может быть ОК), включая указание значения отказа, если это необходимо?
Например, у меня есть следующий код, который чувствует себя kludgy, но, по крайней мере, выполняет (большую часть) работу:
import scala.util._
case class ARef(value: String)
case class BRef(value: String)
case class A(ref: ARef, bRef: BRef)
class MismatchException(msg: String) extends RuntimeException(msg)
trait MyTry {
// Given:
val validBRefs: List[BRef]
// Want to go from an Option[A] (obtained, eg., via a function call passing a provided ARef)
// to a Try[BRef], where the b-ref needs to be checked against the above list of BRefs or fail:
def getValidBRefForReferencedA(aRef: ARef): Try[BRef] = {
val abRef = for {
a <- get[A](aRef) // Some function that returns an Option[A]
abRef = a.bRef
_ <- validBRefs.find(_ == abRef)
} yield (abRef)
abRef match {
case Some(bRef) => Success(bRef)
case None => Failure(new MismatchException("No B found matching A B-ref"))
}
}
}
Похоже, что должен быть способ окончательного совпадения превращаться в карту или flatMap или аналогичную конструкцию и включаться в предысторию для понимания.
Кроме того, я предпочел бы иметь возможность указывать другое сообщение об ошибке, если вызов возвратить опцию [A] из ARef не удалось (возвращается None) по сравнению с ошибкой BRef (я забочусь только об одной причине для отказ, поэтому проверка достоверности скаляз не похожа на идеальную подгонку).
Это подходящее место для использования монадного трансформатора? Если да, то делает ли scalaz подходящий вариант, или кто-нибудь может дать пример того, как он будет выглядеть?