首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么导入cats.implicits._不再需要导入类型类实例?

为什么导入cats.implicits._不再需要导入类型类实例?
EN

Stack Overflow用户
提问于 2020-09-12 23:21:02
回答 1查看 886关注 0票数 4

在Cats 2.1.x类型中,类实例是通过import cats.implicits._引入作用域的。

代码语言:javascript
复制
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中,它可以不使用import cats.implicits._,例如

代码语言:javascript
复制
scala> import cats.Show
import cats.Show

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

从现在起,什么改变了,我们应该如何使用进口产品?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-13 01:16:50

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

代码语言:javascript
复制
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中,类型类的实例是在伴生对象中定义的,因此它们在作用域(隐式范围)中是自动的,不需要导入

代码语言:javascript
复制
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.syntax.all._替换cats.syntax.all._导入并删除任何cats.instances导入。不过,使用Cats 2.2.x并不需要进行此更改,因为此版本没有删除任何内容。导入cats.implicits._将在Cats 2.1.x和2.2.x上执行完全相同的操作,因为导入的实例比隐式范围具有更高的优先级。您只是看不到编译时的改进。 这条规则有一个例外。cats.implicits包提供了从猫自己的OrderPartialOrder类型类到标准库的OrderingPartialOrdering的隐式转换。这种转换在隐式作用域中是不可用的,因为Cats将它不拥有的类型类的实例放入它不拥有的类型的范围(也是因为它不可能)。

Scala在哪里寻找植入?

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63865759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档