我如何(最好)将方法调用返回的 Option 转换为 Try (根据偏好,尽管 Either 或 scalaz\/
甚至 Validation 可能都可以),包括在适当的情况下指定 Failure 值?
例如,我有以下代码,感觉很笨拙,但至少可以完成(大部分)工作:
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"))
}
}
}
感觉应该有一种方法可以将最终匹配变形为 map 或 flatMap 或类似的构造,并合并到前面的理解中。
此外,如果与 BRef 检查失败相比,从 ARef 返回 Option[A] 的调用失败(返回 None),我希望能够指定不同的失败消息(我只关心知道失败的一个原因,因此 scalaz Validation 感觉并不理想)。
这是使用单子变压器的合适地方吗?如果是这样,scalaz 是否提供合适的,或者有人可以举例说明它的外观吗?