Scala模式匹配(尝试,尝试)

哈盖

我有以下元组-(t1,t2):(Try,Try)

我想检查两个都成功还是一个失败,但是要避免代码重复。就像是:

(t1,t2) match {
case (Success(v1),Success(v2)) => new MyClass(v1,v2)
case (Failure(e),_) | (_,Failure(e)) => println(e.getMessage)
}

当然,第二条语句不起作用,因为我需要提供不同的提取变量。但是然后我必须检查它们,因为我不知道哪个失败并且实际上包含Throwable。我希望Try像Future一样,所以它具有Try.sequence(t1,t2)。

任何想法如何使它优雅地工作?

奥利维尔·布兰维林

您可以针对这种(_, Failure(e))情况进行尾部递归调用

@annotation.tailrec
def apply(t1: Try[Any], t2: Try[Any]): Any =
  (t1, t2) match {
    case (Success(v1), Success(v2)) => new MyClass(v1,v2)
    case (Failure(e), _) => println(e.getMessage)
    case _ => apply(t2, t1)
  }

让您优雅地做到这一点。对于任何F[_]: TraverseG[_]: Applicative,它都定义了Future.sequence

def sequence(fa: F[G[A]]): G[F[A]]

该库还为Try提供了开箱即用的实例导线文档中进一步阅读

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章