Wie mache ich eine Funktion mit futures tail-rekursiv?

In meiner Scala app, ich habe eine Funktion aufruft, die eine Funktion liefert ein Ergebnis vom Typ Future[T]. Ich übergeben zu müssen, das zugeordnete Ergebnis in meinem rekursiven Aufruf der Funktion. Ich will, dass das tail-rekursiv ist, aber die Karte (oder flatMap) bricht die Fähigkeit, das zu tun. Ich bekomme die Fehlermeldung "der Rekursive Aufruf nicht in den Schwanz-position."

Unten ist ein einfaches Beispiel für dieses Szenario. Wie können diese modifiziert werden, so dass der Aufruf tail-rekursiv (ohne das untergraben der Vorteile von Futures mit einer Erwarten.Ergebnis())?

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)

InformationsquelleAutor Donuts | 2013-06-06

Schreibe einen Kommentar