scala - 如何从 Scalaz 中的 Future 中获取价值?
问题描述
我有以下代码:
package functorapplication
import scalaz._
import Scalaz._
import scalaz.concurrent.Future
object FunctorApplication2 extends App {
val f1 = Future(3)//(ec)
val f2 = Future(4)//(ec)
val f3 = Future(5)//(ec)
val calculate = (a: Int) => (b: Int) => (c: Int) => a + b + c
val area = f1 <*> (f2 <*> (f3 <*> Future(calculate)))//(ec))) // Future(12)
//println(area)//BindSuspend(scalaz.concurrent.Future$$Lambda...
println("starting")
val summed = for {
a <- area
} yield {
println(a)
}
area.map(value => println(value))
//println(summed)//Suspend(scalaz.concurrent.Future$$Lambda...
println("done")
}
这给出了以下结果:
starting
done
关键是 - 在未来似乎没有任何价值在理解或被映射。
我的问题是:如何从 Scalaz 的 Future 中获取价值?
笔记:
这是我的斯卡拉版本
scalaVersion := "2.12.5",
这是我的 scalaz 版本
"org.scalaz" %% "scalaz-core" % "7.2.26",
"org.scalaz" %% "scalaz-concurrent" % "7.2.26",
"org.scalaz" %% "scalaz-effect" % "7.2.26",
"org.scalaz" %% "scalaz-iteratee" % "7.2.26"
解决方案
如果您持有 type 的值Future[A]
,那么您有资格在将来的某个时间获得
- 要么是类型的值
A
- 或者取而代之的是一个错误,表示为 type 的值
Throwable
。
因此,未来代表了潜在的未来价值。获得未来值的唯一已知方法是等待它。
import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._
val f1 = Future(3)//(ec)
val f2 = Future(4)//(ec)
val f3 = Future(5)//(ec)
val calculate = (a: Int) => (b: Int) => (c: Int) => a + b + c
val area: Future[Int] = for {
v1 <- f1
v2 <- f2
v3 <-f3
} yield calculate(v1)(v2)(v3)
println("starting")
println("adding future side effect")
//this happens in the future
val withSideEffect = area.map(value => println("side-effect: " + value))
println("awaiting now")
//now, let's wait
println("Await: " + Await.ready(withSideEffect, Duration.Inf).value)
println("done")
这打印:
starting
adding future side effect
awaiting now
side-effect: 12
Await: Some(Success(()))
done
推荐阅读
- r - 错误:无法在未命名的向量中选择
- azure-cosmosdb - 在 cosmosDB/MongoDB API 中,使用排序规则选项 numericOrdering 按包含数字的字符串字段进行排序不起作用
- python - TypeError:“PosixPath”类型的参数不可迭代,旧解决方案不起作用
- c# - 为什么我不能全部删除?
- r - 将数字转换为字符串,同时在 R 中保持字符不变
- devops - 持续部署是否意味着我们不使用预生产环境?
- python - 如何在 Json 响应 Python 中合并 order_id
- amazon-s3 - 如何使用 Cloudfront 在没有公共访问权限的私有 S3 存储桶上托管静态网站?
- react-native - React Native:_this.setState 不是 react-navigation 应用程序中抛出的函数
- python - openCV中是否有一种方法可以裁剪图像并将未裁剪的区域保留为黑色?