gpt4 book ai didi

scala - 我如何(最好)将Option转换为Try?

转载 作者:行者123 更新时间:2023-12-03 12:41:24 31 4
gpt4 key购买 nike

我如何(最好)将方法调用返回的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或类似的结构,并整合到前面的内容中以进行理解。

另外,如果从ARef返回Option [A]的调用失败(返回None)与BRef检查失败(我只关心知道失败的一个原因,因此,scalaz验证并不理想。

这是使用monad变压器的合适场所吗?如果是这样,scalaz是否提供了一个合适的示例,或者有人可以举例说明它的外观?

最佳答案

如果您从for-comp开始时使用Try开始,则可以在最后消除匹配项。您可以通过OptionTry强制为fold来实现此目的。这是可能的样子:

def getValidBRefForReferencedA(aRef: ARef): Try[BRef] = {
for {
a <- get[A](aRef).fold[Try[A]](Failure[A](new OtherException("Invalid aRef supplied")))(Success(_))
abRef = a.bRef
_ <- validBRefs.find(_ == abRef).fold[Try[BRef]](Failure(new MismatchException("No B found matching A's B-ref")))(Success(_))
} yield abRef
}

使用这种方法,可以为两个不同的检查获得不同的异常(exception)。它不是完美的,但也许对您有用。

关于scala - 我如何(最好)将Option转换为Try?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17521709/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com