Scalaz 和 scala.concurrent.Future
Scalaz and scala.concurrent.Future
OptionT[Future[_], A]
转换器需要在范围内隐式 Functor[Future]
。但是,如果将证据移动到另一个没有隐式 ExecutionContext
的文件,编译器将失败并显示错误 Cannot find an implicit ExecutionContext.
。是否可以编写一个没有证据定义的代码,并将使用 ExecutionContext
在调用 OptionT
时可用?
import scala.concurrent.{Await, Future}
import scalaz._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._
object Hello {
implicit val ev = new Functor[scala.concurrent.Future] {
override def map[A, B](fa: Future[A])(f: (A) => B): Future[B] = fa.map(f)
}
def main(args: Array[String]): Unit = {
val task: Future[Option[String]] = Future { Some("hello") }
val scream = (for( message <- OptionT(task)) yield message.toUpperCase()).run
val msg = Await.result(scream, 10.seconds)
println(msg.get)
}
}
有证据需要执行上下文:
implicit def ev (implicit ec: ExecutionContext) =
new Functor[scala.concurrent.Future] {
override def map[A, B](fa: Future[A])(f: (A) => B): Future[B] = fa.map(f)
}
这样只需要在调用时提供执行上下文。
OptionT[Future[_], A]
转换器需要在范围内隐式 Functor[Future]
。但是,如果将证据移动到另一个没有隐式 ExecutionContext
的文件,编译器将失败并显示错误 Cannot find an implicit ExecutionContext.
。是否可以编写一个没有证据定义的代码,并将使用 ExecutionContext
在调用 OptionT
时可用?
import scala.concurrent.{Await, Future}
import scalaz._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._
object Hello {
implicit val ev = new Functor[scala.concurrent.Future] {
override def map[A, B](fa: Future[A])(f: (A) => B): Future[B] = fa.map(f)
}
def main(args: Array[String]): Unit = {
val task: Future[Option[String]] = Future { Some("hello") }
val scream = (for( message <- OptionT(task)) yield message.toUpperCase()).run
val msg = Await.result(scream, 10.seconds)
println(msg.get)
}
}
有证据需要执行上下文:
implicit def ev (implicit ec: ExecutionContext) =
new Functor[scala.concurrent.Future] {
override def map[A, B](fa: Future[A])(f: (A) => B): Future[B] = fa.map(f)
}
这样只需要在调用时提供执行上下文。