В моем приложении Scala у меня есть функция, которая вызывает функцию, которая возвращает результат типа Future [T]. Мне нужно передать отображаемый результат в мой вызов рекурсивной функции. Я хочу, чтобы это было хвостом рекурсивным, но карта (или flatMap) нарушает способность этого делать. Я получаю сообщение об ошибке "Рекурсивный вызов не в положении хвоста".
Ниже приведен простой пример этого сценария. Как это можно изменить так, чтобы вызов был хвостом рекурсивным (без подрыва преимуществ Futures с Await.result())?
import scala.annotation.tailrec
import scala.concurrent.{Await, Future}
import scala.concurrent.duration._
implicit val ec = scala.concurrent.ExecutionContext.global
object FactorialCalc {
def factorial(n: Int): Future[Int] = {
@tailrec
def factorialAcc(acc: Int, n: Int): Future[Int] = {
if (n <= 1) {
Future.successful(acc)
} else {
val fNum = getFutureNumber(n)
fNum.flatMap(num => factorialAcc(num * acc, num - 1))
}
}
factorialAcc(1, n)
}
protected def getFutureNumber(n: Int) : Future[Int] = Future.successful(n)
}
Await.result(FactorialCalc.factorial(4), 5.seconds)