在 scala 中使用 futures 的 Curried 函数
Curried functions with futures in scala
我正在学习 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]
我假设您正在尝试组合两个 Int => Future[Int]
类型的函数(应用第一个参数后两个函数的类型),然后在参数 2
上执行结果函数并等待结果。如果我的假设是正确的,那么您不能只使用 andThen
,因为您需要对函数的域(输入类型)和 co-domain(输出类型)不相同的行为进行建模。
您可以像这样使用原生 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
时会发生以下情况:
curriedMultiply(10)(2)
returns Future[Int]
包含 10 * 2
值 (Future(10 * 2)
)
curriedAdd(10)
returns Int => Future[Int]
函数即 y:Int => Future(10 + y)
- 现在你有
Future(10 * 2).flatMap(y => Future(10 + y))
flatMap
returns Future
由其参数的函数生成。在哪里
y
是left-sideFuture
计算出的值20
我正在学习 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]
我假设您正在尝试组合两个 Int => Future[Int]
类型的函数(应用第一个参数后两个函数的类型),然后在参数 2
上执行结果函数并等待结果。如果我的假设是正确的,那么您不能只使用 andThen
,因为您需要对函数的域(输入类型)和 co-domain(输出类型)不相同的行为进行建模。
您可以像这样使用原生 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
时会发生以下情况:
curriedMultiply(10)(2)
returnsFuture[Int]
包含10 * 2
值 (Future(10 * 2)
)curriedAdd(10)
returnsInt => Future[Int]
函数即y:Int => Future(10 + y)
- 现在你有
Future(10 * 2).flatMap(y => Future(10 + y))
flatMap
returnsFuture
由其参数的函数生成。在哪里y
是left-sideFuture
计算出的值20