gpt4 book ai didi

scala - scala 中带有 future 的柯里化(Currying)函数

转载 作者:行者123 更新时间:2023-12-03 04:18:46 25 4
gpt4 key购买 nike

我正在学习 scala,想了解如何为柯里化(Currying)函数实现 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]

最佳答案

我假设您正在尝试组合 Int => Future[Int] 类型的两个函数(应用第一个参数后两个函数的类型),然后在参数 上执行结果函数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)

或者使用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)

could you please explain how the flatmap works here.

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

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

关于scala - scala 中带有 future 的柯里化(Currying)函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56470400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com