【问题标题】:Why is import cats.implicits._ no longer necessary for importing type class instances?为什么 import cat.implicits._ 不再需要导入类型类实例?
【发布时间】:2020-12-31 01:56:19
【问题描述】:

在 Cats 2.1.x 中,类型类实例被引入到 import cats.implicits._ 范围内

scala> import cats.Show
import cats.Show

scala> Show[Int].show(42)
<console>:13: error: could not find implicit value for parameter instance: cats.Show[Int]
       Show[Int].show(42)
           ^

scala> import cats.implicits._
import cats.implicits._

scala> Show[Int].show(42)
res1: String = 42

但是在 Cats 2.2.0 中,它可以在没有 import cats.implicits._ 的情况下工作

scala> import cats.Show
import cats.Show

scala> Show[Int].show(42)
val res0: String = 42

从现在开始我们应该如何使用导入?

【问题讨论】:

  • @LuisMiguelMejíaSuárez 我认为在 SO 中记录它会很有用。我可以回答,但也许其他人想试一试。

标签: scala import typeclass implicit scala-cats


【解决方案1】:

在 2.1.x 中,类型类的实例是在单独的对象中定义的,因此为了在范围内(本地范围),它们必须被导入

object implicits extends instances.AllInstances with ...

trait AllInstances extends AnyValInstances with ...

trait AnyValInstances extends IntInstances with ...

trait IntInstances extends cats.kernel.instances.IntInstances {
  implicit val catsStdShowForInt: Show[Int] = Show.fromToString[Int]
}

在 2.2.0 中,类型类的实例是在伴随对象中定义的,因此它们会自动在范围内(隐式范围)并且不必导入

object Show extends ScalaVersionSpecificShowInstances with ShowInstances {
  ...
  implicit def catsShowForInt: Show[Int] = cats.instances.int.catsStdShowForInt
  ...
}

发布说明https://github.com/typelevel/cats/releases/tag/v2.2.0

在大多数情况下,切换到使用新的隐式作用域实例所需要做的就是将 cats.implicits._ 导入替换为 cats.syntax.all._ 并删除任何 cats.instances 导入。但是,您不必进行此更改即可使用 Cats 2.2.x,因为此版本不会删除任何内容。导入cats.implicits._ 将在 Cats 2.1.x 和 2.2.x 上做同样的事情,因为导入的实例比隐式范围具有更高的优先级。您只是不会看到编译时间的改进。

这条规则有一个例外。 cats.implicits 包提供了从 Cats 自己的 OrderPartialOrder 类型类到标准库的 OrderingPartialOrdering 的隐式转换。这种转换在隐式作用域中不可用,因为对于 Cats 来说,将它不拥有的类型类的实例放入它不拥有的类型的作用域是一个坏主意(也因为这是不可能的)。

Where does Scala look for implicits?

https://docs.scala-lang.org/tutorials/FAQ/finding-implicits.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    相关资源
    最近更新 更多