【发布时间】:2019-05-08 14:32:51
【问题描述】:
object FuncUtils {
@tailrec
def tryAll[T](funcs: (() => Any)*): Option[Any] = {
if (funcs.isEmpty) {
None
} else {
try {
Some(funcs.head())
} catch {
case _: Throwable => FuncUtils.tryAll(funcs.tail: _*)
}
}
}
}
为什么?在我看来,tryAll 是自包含的,可以在不引用调用堆栈的情况下进行迭代。
【问题讨论】:
-
你为什么要对一个可选项进行尾递归?
-
因为最终返回值是可选的。返回类型与尾递归有何关系? @DamianLattenero 我使用递归的主要原因是因为 try catch 块。这些不是功能构造。通过将异常的概念封装到 Option Monad 中,我实质上是将程序函数转换为函数函数。
-
不需要递归:
funcs.toStream.flatMap(f => util.Try(f()).toOption).headOption
标签: scala recursion tail-recursion