【问题标题】:value |@| is not a member of scala.concurrent.Future[String]价值 |@|不是 scala.concurrent.Future[String] 的成员
【发布时间】:2014-12-10 16:50:40
【问题描述】:

我正在尝试使用 Scalaz 的应用构建器来简化一些并行运行多个期货的代码:

import scalaz._, Scalaz._

val fooF: Future [String] = myService.getFoo ()
val barF: Future [String] = myService.getBar ()
val resultF = for {
  foo <- fooF
  bar <- barF
}
yield { foo + bar }

我知道我应该能够像这样重写上面的代码:

val resultF = (myService.getFoo () |@| myService.getBar ()) {
  (foo, bar) => { foo + bar }
}

但是我收到以下编译错误:

value |@| is not a member of scala.concurrent.Future[String]

我做错了什么?

【问题讨论】:

  • 哪个期货?斯卡拉期货?斯卡拉兹期货?别的东西?如果是 scala 期货,那么 scalaz 是什么版本?旧版本的 scalaz 没有 scala.concurrent.Future 类型类实例,您必须为它们导入 scalaz-contrib 库。

标签: scala scalaz


【解决方案1】:

您需要在范围内具有隐式 ExecutionContext,它需要为 Future(以及 Monad 等)构建 Applicative

  import scalaz._, Scalaz._

  import scala.concurrent.{Await, Future}
  import scala.concurrent.duration._

  import scala.concurrent.ExecutionContext.Implicits.global

  val fooF: Future [String] = Future("aaa")
  val barF: Future [String] = Future("bbb")

  val result = (fooF |@| barF)((l, r) => s"$l$r")

  println(Await.result(result, 10.seconds))

更新

你可以在 scalaz.std.Future.scala 中查看

implicit def futureInstance(implicit ec: ExecutionContext): Monad[Future] with Cobind[Future] =
    new FutureInstance

【讨论】:

  • 我在范围内确实有一个隐式执行上下文。
  • 你使用什么版本的scalaz? Monad for Future 仅在 scalaz 7.1 后可用
  • 可能是:7.0.5
  • 查看 scalaz-contrib 0.1.5 (github.com/typelevel/scalaz-contrib/blob/v0.1.5/scala210/main/…) 了解 scala.concurrent.Future monad 定义 pre scalaz 7.1。
  • 您可能需要仔细检查 Applicative[Future] 定义在碰撞 scalaz 版本时在串行与并行评估方面的行为是否符合您的要求。关于正确行为的 scalaz 邮件列表存在一些争论。我不记得最后的共识是什么。最好的办法是查看源代码,但这是我正在考虑的线程groups.google.com/forum/#!topic/scalaz/IuFfWJIXXTo
猜你喜欢
  • 2018-03-14
  • 2017-08-22
  • 2017-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多