メソッド呼び出しによって返された Option を、必要に応じて Failure 値を指定して Try に変換するには\/
どうすればよいでしょうか?
たとえば、私は次のコードを持っています。
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"))
}
}
}
最終的な一致をマップまたは flatMap または同様の構造にモーフィングし、理解のために前に組み込む方法が必要なように感じます。
また、BRef チェックの失敗と比較して、ARef から Option[A] を返す呼び出しが失敗した (None が返された) 場合に、別の失敗メッセージを指定できるようにしたいと思います (失敗の 1 つの理由を知ることだけに関心があります。そのため、scalaz Validation は理想的には適合しないように感じます)。
これはモナド変換子を使用するのに適した場所ですか? もしそうなら、scalaz は適切なものを提供していますか? あるいは、誰かがそれがどのように見えるかの例を挙げてもらえますか?