scala - 类路径中缺少符号 'type cats.MonadFilter'

标签 scala scala-cats monix

我正在 tagless final 上阅读本教程。

基于此,我将我的依赖项定义为

object Dependencies {
  lazy val scalaTest = "org.scalatest" %% "scalatest" % "3.0.5"
  lazy val cats = "org.typelevel" %% "cats-core" % "1.2.0"
  lazy val monix = "io.monix" %% "monix" % "2.3.3"
  lazy val monixCats = "io.monix" %% "monix-cats" % "2.3.3"
}

以下是我的代码

// future
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent._
import scala.concurrent.duration._

// cats
import cats.Monad
import cats.implicits._

// monix
import monix.eval.Task
import monix.cats._
import monix.cats.reverse._


trait ProductRepository[M[_]] {
  def findProduct(productId: ProductId) : M[Option[Product]]
  def saveProduct(product: Product) : M[Unit]
  def incrementProductSales(productId: ProductId, quantity: Long) : M[Unit]
}

class ProductRepositoryWithFuture extends ProductRepository[Future] {
  def findProduct(productId: ProductId) : Future[Option[Product]] = {
    Future.successful(Some(Product(productId, "foo")))
  }
  def saveProduct(product: Product) : Future[Unit] = {
    Future.successful()
  }
  def incrementProductSales(productId: ProductId, quanity: Long) : Future[Unit] = {
    Future.successful()
  }
}

class ProductRepositoryWithTask extends ProductRepository[Task] {
  def findProduct(productId: ProductId) : Task[Option[Product]] = {
    Task.now(Some(Product(productId, "foo")))
  }
  def saveProduct(product: Product) : Task[Unit] = {
    Task.unit
  }
  def incrementProductSales(productId: ProductId, quantity: Long) : Task[Unit] = {
    Task.unit
  }
}

但是我遇到了很多错误。看来我使用的 cats 版本与 Monix 使用的版本不兼容。

我还尝试删除我的 cats 依赖项并导入 monix,以便 monix 引入自己版本的 cats。但即使这样也无法编译。

error] /Users/foobar/code/tagless/src/main/scala/example/Hello.scala:54:24: Symbol 'type cats.MonadFilter' is missing fromthe classpath.
[error] This symbol is required by 'method monix.cats.MonixToCatsCore7.monixToCatsMonadFilter'.
[error] Make sure that type MonadFilter is in your classpath and check for conflicting dependencies with `-Ylog-classpath`.
[error] A full rebuild may help if 'MonixToCatsCore7.class' was compiled against an incompatible version of cats.
[error]       repo.findProduct(id).flatMap{
[error]                        ^
[error] /Users/foobar/code/tagless/src/main/scala/example/Hello.scala:54:23: diverging implicit expansion for type monix.types.Comonad[M]
[error] starting with method catsToMonixComonad in trait CatsCoreToMonix5
[error]       repo.findProduct(id).flatMap{
[error]                       ^
[error] /Users/foobar/code/tagless/src/main/scala/example/Hello.scala:54:28: value flatMap is not a member of type parameter M[Option[example.Application.Product]]
[error]       repo.findProduct(id).flatMap{
[error]                            ^
[error] /Users/foobar/code/tagless/src/main/scala/example/Hello.scala:56:30: value copy is not a member of Any
[error]           val newProduct = p.copy(name = name)
[error]                              ^
[error] /Users/foobar/code/tagless/src/main/scala/example/Hello.scala:56:40: reassignment to val
[error]           val newProduct = p.copy(name = name)
[error]                                        ^
[error] /Users/foobar/code/tagless/src/main/scala/example/Hello.scala:57:27: diverging implicit expansion for type monix.types.MonadError[M,E]
[error] starting with method catsToMonixMonadError in trait CatsCoreToMonix3
[error]           repo.saveProduct(newProduct).map(_ => Some(p))
[error]                           ^
[error] /Users/foobar/code/tagless/src/main/scala/example/Hello.scala:57:40: value map is not a member of type parameter M[Unit]
[error]           repo.saveProduct(newProduct).map(_ => Some(p))
[error]                                        ^
[error] /Users/foobar/code/tagless/src/main/scala/example/Hello.scala:59:16: diverging implicit expansion for type cats.Comonad[M]
[error] starting with method monixToCatsComonad in trait MonixToCatsCore5
[error]           Monad[M].pure(None)
[error]                ^
[error] 8 errors found

最佳答案

这些错误是由依赖项之间的不兼容引起的。 例如 monix 2.3.3取决于猫0.9.0当您尝试使用1.2.0时这是二进制不兼容的。

您应该尝试升级 monix3.x或降级cats0.9.0 .

附注从猫的转变0.9.01.x有很多突破changes并且您必须确保您使用的所有库都是针对相同(或至少二进制兼容)版本的 cats 进行编译的。

关于scala - 类路径中缺少符号 'type cats.MonadFilter',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51626280/

相关文章:

scala - 如何处理 monix onErrorHandle 中抛出的未处理异常

scala - 如何在 Scala 中使用 Monix 使用分页资源?

scala - if (Option.nonEmpty) 与 Option.foreach

scala - 在函数式 Scala 中,将一种参数化类型转换为另一种参数化类型的好方法是什么?

Scala:类型模式匹配期间的前向引用错误

scala - scala cats IOApp 应该如何获取 ExecutionContext?

scala - 在 Scala 中的功能步骤之间传递状态

monix - 将 Observable 写入文件

syntax - 元组参数声明和赋值奇怪

scala - Spark 上的数据分析 Scala