Scala value pure不是的成员

Scala value pure不是的成员,scala,scala-cats,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 Futu

我已经写了这个代码

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)
这是我的身材

name := "PureTest"
version := "1.0"
scalaVersion := "2.11.8"
libraryDependencies ++= Seq(
   "org.typelevel" % "cats-core_2.11" % "0.9.0"
)
这段代码编译后运行良好

如果我添加一行
import cats.implicits.\u
作为导入之一,那么我会得到编译错误

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]

为什么导入
隐式。会破坏代码?

如果隐式转换/类etc中存在歧义,编译器将不选择任何一个。如果pimp my library模式取决于分辨率,那么您将以“无此类方法错误”结束

让我们看一看猫。隐式
(我从IntelliJ中获取了“字节码”版本):

由于
cats.implicits.\u
同时获取
cats.syntax.all.\u
cats.instances.all.\u
,您将获取
cats.syntax.all.\u
两次(在功能方面-在代码方面,它们位于不同的对象中,因此它们被视为两组不同的转换)


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

如果隐式转换中存在歧义,则/class etc编译器不会选择其中任何一个。如果pimp my library模式取决于分辨率,那么您将以“无此类方法错误”结束

让我们看一看猫。隐式(我从IntelliJ中获取了“字节码”版本):

由于
cats.implicits.\u
同时获取
cats.syntax.all.\u
cats.instances.all.\u
,您将获取
cats.syntax.all.\u
两次(在功能方面-在代码方面,它们位于不同的对象中,因此它们被视为两组不同的转换)


底线是,您两次获取相同的转换,但都是通过两个不同的对象获取的-因此编译器很混乱,无法使用它们来提供您想要的方法。

您在这里使用的是Future,请检查这是否是错误:通过在范围中导入一些隐式ExecutionContext。我添加了它(请参阅上面更新的问题)但问题仍然没有解决。我发现了是什么破坏了代码。如果我删除
import cats.implicits.\u
则代码工作正常。添加导入将破坏代码。但是为什么?您在这里使用的是Future,请检查这是否是错误:通过在范围中导入一些隐式ExecutionContext。我添加了它(请参见上面更新的问题),但问题仍然没有解决。我发现了破坏代码的原因。如果我删除
import cats.implicits.\u
则代码工作正常。添加导入将破坏代码。但是为什么呢?
package cats
object implicits extends scala.AnyRef with cats.syntax.AllSyntax with cats.instances.AllInstances {
}