Если я правильно понимаю, scala.util.control.TailCalls можно использовать, чтобы избежать для не хвостовых рекурсивных функций, используя батут. Пример, приведенный в API, прост:
import scala.util.control.TailCalls._
def isEven(xs: List[Int]): TailRec[Boolean] =
if (xs.isEmpty) done(true) else tailcall(isOdd(xs.tail))
def isOdd(xs: List[Int]): TailRec[Boolean] =
if (xs.isEmpty) done(false) else tailcall(isEven(xs.tail))
isEven((1 to 100000).toList).result
Однако более интересным является случай, если вы хотите выполнить некоторые операции после вызова recursve. Я получил "наивную" факториальную реализацию, как-то запущенную
def fac(n:Long): TailRec[Long] =
if (n == 0) done(1) else done(n * tailcall(fac(n - 1)).result)
но это выглядит ужасно, и я сомневаюсь, что это намеренное использование. Итак, мой вопрос заключается в том, как правильно правильно использовать функцию факториала или фибоначчи с помощью TailCalls (да, я знаю, как использовать аккумуляторы, чтобы получить их хвост-рекурсивный)? Или TailCalls не подходит для такого рода проблем?