Cats Future Monad给出运行时异常

时间:2017-08-09 13:26:53

标签: scala monads future scala-cats

import cats.Monad
import cats.instances.future._
import scala.concurrent._
import scala.concurrent.duration._

import scala.concurrent.ExecutionContext.Implicits.global

val fm = Monad[Future]

Await.result(
  fm.flatMap(fm.pure(1)) {
    x => fm.pure(x+2)
  }, 1.second
)

这给了我一个运行时异常,我不明白为什么。我使用scala版本2.12.2和猫版本cat-core_2.12

  

java.lang.NoClassDefFoundError:无法初始化类   $ line9。$读$$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $$ IW $           在scala.concurrent.Future。$ anonfun $ flatMap $ 1(Future.scala:302)           在scala.concurrent.impl.Promise。$ anonfun $ transformWith $ 1(Promise.scala:37)           在scala.concurrent.impl.CallbackRunnable.run(Promise.scala:60)           at scala.concurrent.impl.ExecutionContextImpl $ AdaptedForkJoinTask.exec(ExecutionContextImpl.scala:140)           at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)           在java.util.concurrent.ForkJoinPool $ WorkQueue.runTask(ForkJoinPool.java:1056)           在java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)           在java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)   java.util.concurrent.TimeoutException:期货在[1]之后超时   第二个]   scala.concurrent.impl.Promise $ DefaultPromise.ready(Promise.scala:255)   在   scala.concurrent.impl.Promise $ DefaultPromise.result(Promise.scala:259)   在scala.concurrent.Await $。$ anonfun $ result $ 1(package.scala:215)at at   scala.concurrent.BlockContext $ DefaultBlockContext $ .blockOn(BlockContext.scala:53)   在scala.concurrent.Await $ .result(package.scala:142)... 43 elided

2 个答案:

答案 0 :(得分:3)

这些错误通常意味着您的依赖项中有两个非二进制兼容版本的同一个库。尝试运行sbt evicted并查看是否有任何cats-core版本被驱逐。

然后你必须确保每个人都使用相同的版本(可能你只需要将你的版本更新到最新的版本)。

答案 1 :(得分:0)

这是由于repl中的错误

https://github.com/scala/bug/issues/9076

在sbt控制台中运行代码可以正常工作。

import scala.concurrent._
import scala.concurrent.duration._
import cats.Monad
import cats.instances.future._
import scala.concurrent.ExecutionContext.Implicits.global

object Test extends App {
  println("Inside test")
  val fm = Monad[Future]
  val x = Await.result(
    fm.flatMap(fm.pure(1)) {
      x => fm.pure(x+2)
    }, 1.second
  )
  println(x)
}