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
function1
returns Future[Option[Customer]]
function2
returns String
function3
returns Seq[Future[Option[String]]]
同时这是 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
(或以其他方式提供),你会没事的。
考虑以下使用 ScalaZ 的 OptionT
的代码:
val answer = for {
customer <- optionT(function1(codeString))
customerId <- someOptionT(Future(Seq(function2(customer)))
alerts <- someOptionT(Future.sequence(function3(customerId))
} yield alerts
function1
returnsFuture[Option[Customer]]
function2
returnsString
function3
returnsSeq[Future[Option[String]]]
同时这是 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
(或以其他方式提供),你会没事的。