我正在学习scala,并且想了解如何Futures
用于咖喱函数
import scala.concurrent.{Await, Future}
import scala.concurrent.duration.Duration
import scala.concurrent.ExecutionContext.Implicits.global
object MainApp {
def main(args: Array[String]): Unit = {
val x = curriedMultiply(10) _ andThen Await.result(curriedAdd(10),Duration.Inf)
println(x(2))
}
def curriedAdd(x: Int)(y: Int) : Future[Int]= Future {
x + y
}
def curriedMultiply(x: Int)(y: Int) : Future[Int] = Future {
x * y
}
}
获取值时出现以下编译器错误
Type mismatch, expected: Awaitable[NotInferedT], actual: Int => Future[Int]
答案 0 :(得分:6)
我假设您正在尝试编写类型为Int => Future[Int]
的两个函数(应用第一个参数后为两个函数的类型),然后在参数2
上执行result函数并等待结果。如果我的假设是正确的,那么您就不能仅使用andThen
,因为您需要在函数的域(输入类型)和共域(输出类型)不同的情况下对行为建模。
您可以通过以下方式执行本机Scala方式:
def combine(x:Int) = curriedMultiply(10)(x) flatMap (curriedAdd(10))
//or: val combine = curriedMultiply(10)(_:Int) flatMap curriedAdd(10)
val y = Await.result(combine(2),Duration.Inf)
println(y)
或使用cats
库,因为类型Int => Future[Int]
的函数是Kleisli
函数,因此您可以编写它们:
import cats.data.Kleisli
import cats.implicits._
val kfk = Kleisli(curriedAdd(10)) compose Kleisli(curriedMultiply(10))
val x = Await.result(kfk(2),Duration.Inf)
println(x)
请您在这里解释平面图的工作原理。
将combine
函数应用于参数2
时,会发生以下情况:
curriedMultiply(10)(2)
返回包含Future[Int]
值(10 * 2
)的Future(10 * 2)
curriedAdd(10)
返回Int => Future[Int]
函数,即y:Int => Future(10 + y)
Future(10 * 2).flatMap(y => Future(10 + y))
flatMap
返回其参数函数产生的Future
。哪里
y
是由左侧Future
计算值20