Scala中带有期货的咖喱函数

wan*_*onk 3 scala function-composition

我正在学习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
  }

}
Run Code Online (Sandbox Code Playgroud)

获取值时出现以下编译器错误

Type mismatch, expected: Awaitable[NotInferedT], actual: Int => Future[Int]
Run Code Online (Sandbox Code Playgroud)

Bog*_*nko 6

我假设您正在尝试组成两个Int => Future[Int]类型的函数(应用第一个参数后,两个函数的类型),然后对参数执行result函数2并等待结果。如果我的假设是正确的,那么您就不能只使用它,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)
Run Code Online (Sandbox Code Playgroud)

或使用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)
Run Code Online (Sandbox Code Playgroud)

您能否在这里解释平面图的工作原理。

combine函数应用于参数时,会发生以下情况2

  1. curriedMultiply(10)(2)返回Future[Int]包含10 * 2值(Future(10 * 2)
  2. curriedAdd(10)返回的Int => Future[Int]函数是y:Int => Future(10 + y)
  3. 现在你有 Future(10 * 2).flatMap(y => Future(10 + y))
  4. flatMapFuture由其参数的函数产生的返回值。y左侧Future计算值产生的值在哪里 20