您可以像这样在 Scala 中翻译您的示例:
import concurrent.{Await, Future, future}
import concurrent.ExecutionContext.Implicits.global
import concurrent.duration.Duration
object Main extends App {
val fac: Int => Int = {
case 0 => 1
case n => n * fac(n-1)
}
val ack: (Int, Int) => Int = {
case (0, n) => n + 1
case (m, 0) => ack (m-1, 1)
case (m, n) => ack (m-1, ack(m, n-1))
}
val fib: Int => Int = {
case 0 => 0
case 1 => 1
case n => fib(n-1) + fib(n-2)
}
val fa = future { ack(3, 10) }
val fb = future { fac(42) }
val fc = future { fib(35) }
val x = for (((a, b), c) <- fa zip fb zip fc) yield (a + b + c)
val result = Await.result(x, Duration.Inf) //awaiting synchronously after the result
println(s"Value is: $result")
}
该future { fib(3, 10) }
位将创建一个异步计算,该计算将在不同的执行线程上运行并返回一个Future
对象。然后,您可以将所有未来组合成一个大未来,该未来将提供所有结果的列表,使用Future.sequence
.
我们可以将后一个future的结果映射到结果的总和中,从而获得最终值。
有了这个最终的未来,我们可以做几件事。我们可以进一步组合它,或者我们可以在其上附加回调,或者我们可以同步等待指定的持续时间。在我的示例中,我在结果之后以同步方式等待无限时间。