value pure 不是的成员
value pure is not a member of
这段代码是我写的
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)
这是我的build.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._
会破坏代码?
如果在隐式 conversion/class 等中存在歧义,编译器会选择其中的 none。如果 pimp-my-library 模式取决于分辨率,您最终会得到 "no such method error".
让我们看一下cats.implicits
(我从我的IntelliJ中获取了"bytecode"版本):
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._
两次(在功能方面 - 在代码方面,它们位于单独的对象,因此它们被视为两组不同的转换。
最重要的是,您两次获取相同的转换,但通过两个不同的对象 - 结果编译器感到困惑,无法使用它们为您提供所需的方法。
这段代码是我写的
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)
这是我的build.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._
会破坏代码?
如果在隐式 conversion/class 等中存在歧义,编译器会选择其中的 none。如果 pimp-my-library 模式取决于分辨率,您最终会得到 "no such method error".
让我们看一下cats.implicits
(我从我的IntelliJ中获取了"bytecode"版本):
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._
两次(在功能方面 - 在代码方面,它们位于单独的对象,因此它们被视为两组不同的转换。
最重要的是,您两次获取相同的转换,但通过两个不同的对象 - 结果编译器感到困惑,无法使用它们为您提供所需的方法。