scala - 使用带有任一 T 的 scala.concurrent.Future 时缺少 Functor 和 Monad 实例

标签 scala monad-transformers scalaz7

我正在尝试将 Scalaz EachT 与 scala.concurrent.Future 一起使用。当试图在理解中使用它时:

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

scalaz 是否为 Functor 和 Monad for Future 定义实例?如果没有,是否还有其他库提供这些实例,或者我是否需要编写它们?

最佳答案

你需要一个隐含的 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")

关于scala - 使用带有任一 T 的 scala.concurrent.Future 时缺少 Functor 和 Monad 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34407163/

相关文章:

scala - 如何返回 EitherT 内的元组

Haskell:lift 与 liftIO

haskell - 在Haskell中使用ErrorT

Scala:使用模式匹配检测 5 张扑克牌中的顺牌

scala - 定义 ADT 时案例对象 T 和案例类 T() 之间的差异?

haskell - 没有 lambda 表达式如何编写这些?

sbt - 如何修复 sbt 的 [warn] Skipped generated '<exclusion/>' for dependency?

logging - Scalaz 7 : Idiomatic way of turning values in Either to plain values plus logged errors?

scala - 如何防范重复请求?

scala - scalaz 中的函数语法谜题