Ошибка не воспроизводима, вы можете попытаться предоставить больше контекста.
В любом случае, я бы также рекомендовал вам не использовать Seq
для хвостовых рекурсивных алгоритмов (вместо этого следует использовать List
) и try / catch
блоков (использовать Try
Вместо монады) .
Это переписать ваш код, используя это.
import scala.util.{Try, Success, Failure}
object FuncUtils {
def tryAll[T](funcs: (() => T)*): Option[T] = {
@annotation.tailrec
def loop(remaining: List[() => T]): Option[T] = remaining match {
case Nil => None
case x :: xs => Try(x()) match {
case Success(t) => Some(t)
case Failure(_) => loop(remaining = xs)
}
}
loop(remaining = funcs.toList)
}
}
Опять же, как сказал jwvh, вам действительно не нужна рекурсия в этом случае.
object FuncUtils {
def tryAll[T](funcs: (() => T)*): Option[T] =
funcs.iterator.map(f => Try(f())).collectFirst { case Success(t) => t }
}