值| @ | 不是scala.concurrent.Future [String]的成员

sun*_*ant 1 scala scalaz

我正在尝试使用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 }
Run Code Online (Sandbox Code Playgroud)

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

val resultF = (myService.getFoo () |@| myService.getBar ()) {
  (foo, bar) => { foo + bar }
}
Run Code Online (Sandbox Code Playgroud)

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

value |@| is not a member of scala.concurrent.Future[String]
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

Eug*_*nev 5

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

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

更新

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

implicit def futureInstance(implicit ec: ExecutionContext): Monad[Future] with Cobind[Future] =
    new FutureInstance
Run Code Online (Sandbox Code Playgroud)

  • 请参阅scalaz-contrib 0.1.5(https://github.com/typelevel/scalaz-contrib/blob/v0.1.5/scala210/main/scala/Future.scala)以了解`scala.concurrent.Future` monad definition pre scalaz 7.1. (2认同)