ScalaZ OptionT 异常

Exception with ScalaZ OptionT

考虑以下使用 ScalaZ 的 OptionT 的代码:

val answer = for {
      customer <- optionT(function1(codeString))
      customerId <- someOptionT(Future(Seq(function2(customer)))
      alerts <- someOptionT(Future.sequence(function3(customerId))
} yield alerts

同时这是 someOptionT

def someOptionT[T](t: Future[T]): OptionT[Future, T] = optionT[Future](t.map(Some.apply))

我在 for 理解的最后一行(使用 alerts)得到以下异常:

could not find implicit value for parameter F: scalaz.Functor[scala.concurrent.Future]

知道为什么吗?

错误消息完全不清楚,但问题与您在 REPL 中编写 myFuture.map(whatever) 且范围内没有隐式执行上下文完全相同。

scala> import scala.concurrent.Future
import scala.concurrent.Future

scala> def foo(myFuture: Future[Int]) = myFuture.map(_ + 1)
<console>:8: error: Cannot find an implicit ExecutionContext. You might pass
an (implicit ec: ExecutionContext) parameter to your method
or import scala.concurrent.ExecutionContext.Implicits.global.
       def foo(myFuture: Future[Int]) = myFuture.map(_ + 1)
                                                    ^

Scalaz 为 Future 提供了一个 Functor(和一个 Monad,等等),但是你必须有一个执行上下文来获取它们。导入 global(或以其他方式提供),你会没事的。