值纯不是成员

  • 本文关键字:成员 scala scala-cats
  • 更新时间 :
  • 英文 :


我写了这段代码

import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global
import cats.Applicative
import cats.data.OptionT
import cats.instances.future._
import cats.syntax.applicative._
object PureTest extends App {
   type FutureOption[T] = OptionT[Future, T]
   val x1 = Applicative[FutureOption].pure(1)
   val y1 = 1.pure[FutureOption]
   println(x1)
   println(y1)
   val x2 = Foo(1).pure[FutureOption]
   val y2 = Bar("1").pure[FutureOption]
   println(x2)
   println(y2)
   val z1 = (Foo(1), Bar("1")).pure[FutureOption]
   println(z1)
}
case class Foo(i: Int)
case class Bar(s: String)

这是我的构建.sbt

name := "PureTest"
version := "1.0"
scalaVersion := "2.11.8"
libraryDependencies ++= Seq(
   "org.typelevel" % "cats-core_2.11" % "0.9.0"
)

此代码可编译并正常工作。

如果我添加一行import cats.implicits._作为导入之一,则会出现编译错误

Error:(16, 14) value pure is not a member of Int
   val x = 1.pure[FutureOption]
Error:(17, 16) value pure is not a member of String
   val y = "1".pure[FutureOption]
Error:(18, 21) value pure is not a member of (Int, String)
   val z = (1, "1").pure[FutureOption]
Error:(19, 32) value pure is not a member of (PureTest.Foo, PureTest.Bar)
   val z1 = (Foo(1), Bar("x")).pure[FutureOption]

为什么导入implicits._会破坏代码?

如果隐式转换/类等存在歧义,编译器不会选择它们中的任何一个。如果皮条客我的库模式取决于分辨率,你最终会得到"没有这样的方法错误"。

让我们来看看cats.implicits(我从我的IntelliJ中获取了"字节码"版本(:

package cats
object implicits extends scala.AnyRef with cats.syntax.AllSyntax with cats.instances.AllInstances {
}

由于cats.implicits._同时获取cats.syntax.all._cats.instances.all._,因此您将获取cats.syntax.all._两次(在功能方面 - 当涉及到代码时,它们位于单独的对象中,因此它们被视为两组不同的转换(。

最重要的是,您通过两个不同的对象获取相同的转换两次 - 因此编译器感到困惑,无法使用它们为您提供所需的方法。

相关内容

  • 没有找到相关文章

最新更新