簡體   English   中英

為什么導入類型類實例不再需要 importcats.implicits._ ?

[英]Why is import cats.implicits._ no longer necessary for importing type class instances?

在 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

發生了什么變化,從現在開始我們應該如何使用導入?

在 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.implicits._導入並刪除任何cats.instances導入。 不過,您無需進行此更改即可使用 Cats 2.2.x,因為此版本不會刪除任何內容。 導入cats.implicits._在Cats 2.1.x 和2.2.x 上會做完全相同的事情,因為導入的實例比隱式作用域具有更高的優先級。 你只是不會看到編譯時間的改進。

這一規則有一個例外。 cats.implicits包提供了從 Cats 自己的OrderPartialOrder類型類到標准庫的OrderingPartialOrdering隱式轉換。 這種轉換在隱式作用域中不可用,因為對於 Cats 來說,將它不擁有的類型類的實例放入它不擁有的類型的作用域中是一個壞主意(也因為這是不可能的)。

Scala 在哪里尋找隱式?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM