在 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
然而在猫中2.2.0 https://scastie.scala-lang.org/2djZTSi9S92SNJb1crzTkw它的工作原理无需import cats.implicits._
例如
scala> import cats.Show
import cats.Show
scala> Show[Int].show(42)
val res0: String = 42
发生了什么变化以及从现在开始我们应该如何使用导入?
在 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 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 自己的隐式转换Order
and PartialOrder
将类键入标准库的Ordering
and PartialOrdering
。此转换在隐式作用域中不可用,因为对于 Cats 来说,将它不拥有的类型类的实例放入它不拥有的类型的作用域中是一个坏主意(而且因为这是不可能的)。
Scala 在哪里寻找隐式? https://stackoverflow.com/questions/5598085/where-does-scala-look-for-implicits
https://docs.scala-lang.org/tutorials/FAQ/finding-implicits.html https://docs.scala-lang.org/tutorials/FAQ/finding-implicits.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)