2014-12-10 3 views
1

Я пытаюсь использовать аппликативный строитель Scalaz, чтобы упростить код, который работает несколько фьючерсов параллельно:значение | @ | не является членом scala.concurrent.Future [String]

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] 

Что я делал неправильно?

+0

которые фьючерсы? фьючерсы scala? фьючерсы на скалаз? что-то другое? Если фьючерсы scala, то какая версия скаляза? более старые версии scalaz не имели экземпляров scala.concurrent.Future typeclass, и вам пришлось импортировать библиотеку scalaz-contrib для них. – stew

ответ

4

Вы должны иметь неявный ExecutionContext в области видимости, это необходимо, чтобы построить Аппликативные для будущего (а также Монада и т.д.)

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)) 

Update

Вы можете проверить это в scalaz.std.Future .scala

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

У меня есть неявный контекст выполнения в области видимости. – sungiant

+1

Какую версию скаляза вы используете? Monad for Future доступен только со скалаза 7.1 –

+0

, который может быть следующим: 7.0.5 – sungiant

Смежные вопросы