Jak mogę (najlepiej) przekonwertować opcję na próbę?

W jaki sposób mogę (najlepiej) przekonwertować opcję zwróconą przez wywołanie metody na próbę (preferowana, chociaż albo albo skalaz\/ lub nawet walidacja może być OK), w tym określenie wartości błędu, jeśli jest to właściwe?

Na przykład mam następujący kod, który wydaje się niezdarny, ale przynajmniej wykonuje (większość) zadanie:

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's B-ref"))
    }
  }
}

Wydaje się, że powinien istnieć sposób na to, aby finałowy mecz został przekształcony w mapę lub płaską mapę lub podobną konstrukcję i włączony do poprzedniej interpretacji.

Ponadto wolałbym móc określić inny komunikat o błędzie, jeśli wywołanie zwracające opcję [A] z ARef nie powiodło się (zwróciło brak) w porównaniu z niepowodzeniem sprawdzania BRef (zależy mi tylko na znajomości jednego powodu niepowodzenia, więc Skalaz Walidacja nie wygląda na idealne dopasowanie).

Czy jest to odpowiednie miejsce do użycia transformatora monadowego? Jeśli tak, to czy skalaz dostarcza odpowiedniego, czy może ktoś może podać przykład, jak by to wyglądało?

questionAnswers(6)

yourAnswerToTheQuestion