gpt4 book ai didi

scala - 链接包含选项的 scala Try 实例

转载 作者:行者123 更新时间:2023-12-04 17:35:33 25 4
gpt4 key购买 nike

我试图找到一种更简洁的方式来表达与此类似的代码:

def method1: Try[Option[String]] = ???
def method2: Try[Option[String]] = ???
def method3: Try[Option[String]] = ???

method1 match
{
case f: Failure[Option[String]] => f
case Success(None) =>
method2 match
{
case f:Failure[Option[String]] => f
case Success(None) =>
{
method3
}
case s: Success[Option[String]] => s
}
case s: Success[Option[String]] => s
}

如您所见,这会按顺序尝试每个方法,如果一个方法失败,则执行停止并且基本匹配解析为该失败。如果 method1 或 method2 成功但包含 None 则尝试序列中的下一个方法。如果执行到达 method3,无论成功或失败,它的结果总是被返回。这在代码中运行良好,但我发现很难跟踪正在发生的事情。

我很想用 a 来理解
for
{
attempt1 <- method1
attempt2 <- method2
attempt3 <- method3
}
yield
{
List(attempt1, attempt2, attempt3).find(_.isDefined)
}

因为它很漂亮,它在做什么很清楚。但是,如果所有方法都成功,那么它们每次都会被执行,而不管较早的方法是否返回可用的答案。不幸的是,我不能拥有它。

任何建议,将不胜感激。

最佳答案

scalaz 可以在这里提供帮助。您将需要 scalaz-contrib,它为 Try 添加一个 monad 实例,然后您可以使用具有不错组合器的 OptionT。下面是一个例子:

import scalaz.OptionT
import scalaz.contrib.std.utilTry._
import scala.util.Try

def method1: OptionT[Try, String] = OptionT(Try(Some("method1")))
def method2: OptionT[Try, String] = OptionT(Try(Some("method2")))
def method3: OptionT[Try, String] = { println("method 3 is never called") ; OptionT(Try(Some("method3"))) }
def method4: OptionT[Try, String] = OptionT(Try(None))
def method5: OptionT[Try, String] = OptionT(Try(throw new Exception("fail")))

println((method1 orElse method2 orElse method3).run) // Success(Some(method1))
println((method4 orElse method2 orElse method3).run) // Success(Some(method2))
println((method5 orElse method2 orElse method3).run) // Failure(java.lang.Exception: fail)

关于scala - 链接包含选项的 scala Try 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20693666/

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