2015-12-22 5 views
3

Я пытаюсь использовать Scalaz EitherT с помощью scala.concurrent.Future. При попытке использовать его в наличии для понимания:Отсутствие экземпляров Functor и Monad при использовании scala.concurrent.Future с EitherT

import scalaz._ 
import Scalaz._ 

val et1:EitherT[Future, String, Int] = EitherT(Future.successful(1.right)) 

val et2:EitherT[Future, String, String] = EitherT(Future.successful("done".right)) 

val r:EitherT[Future, String, String] = for { 
    a <- et1 
    b <- et2 
} yield (s"$a $b") 

Я получаю недостающую Functor и Monad экземпляров ошибка:

could not find implicit value for parameter F: scalaz.Functor[scala.concurrent.Future] 
b <- et2 
^
could not find implicit value for parameter F: scalaz.Monad[scala.concurrent.Future] 
a <- et1 

DoES scalaz определяют экземпляры для функтора и монады для будущего? Если нет других библиотек, которые предоставляют эти экземпляры или мне нужно их написать?

ответ

9

В области требуется неявный ExecutionContext. import ExecutionContext.Implicits.global доставит вам global execution context.

Полный пример:

import scala.concurrent.ExecutionContext.Implicits.global 

    import scalaz._ 
    import Scalaz._ 

    val et1:EitherT[Future, String, Int] = EitherT(Future.successful(1.right)) 

    val et2:EitherT[Future, String, String] = EitherT(Future.successful("done".right)) 

    val r:EitherT[Future, String, String] = for { 
    a <- et1 
    b <- et2 
    } yield s"$a $b" 

    val foo = Await.result(r.run, 1 seconds) 
    // => \/-("1 done") 
+0

, что не похоже на работу. – ssanj

+0

Это работает для меня. Я обновил свой ответ с полным рабочим примером. – danielnixon

+0

Да, это работает! Должно быть, я пропустил что-то, когда пытался. Благодарю. – ssanj