Scala 如何实现从类型类到接口语法的自动转换(Cats示例)

Scala 如何实现从类型类到接口语法的自动转换(Cats示例),scala,implicit-conversion,typeclass,implicit,scala-cats,Scala,Implicit Conversion,Typeclass,Implicit,Scala Cats,我正在阅读Scala with Cats一书,我想知道这个库是如何实现示例中描述的一些功能的。具体来说,它是关于使用隐式转换从现有类型类定义自动生成隐式类 我特别指的是Scala with Cats手册中的练习1.4.6。为了完整起见,我复制了下面的代码 import cats.Show import cats.instances.int._ import cats.instances.string._ import cats.syntax.show._ final case cla

我正在阅读Scala with Cats一书,我想知道这个库是如何实现示例中描述的一些功能的。具体来说,它是关于使用隐式转换从现有类型类定义自动生成隐式类

我特别指的是Scala with Cats手册中的练习1.4.6。为了完整起见,我复制了下面的代码

import cats.Show
import cats.instances.int._    
import cats.instances.string._
import cats.syntax.show._ 

final case class Cat(name: String, age: Int, color: String)

implicit val catShow = Show.show[Cat] { cat =>
  val name  = cat.name.show
  val age   = cat.age.show
  val color = cat.color.show
  s"$name is a $age year-old $color cat."
}

println(Cat("Garfield", 38, "ginger and black").show)
除了最后一行之外,我完全理解这个例子。catShow隐式仅定义类型类。它没有定义Scala with Cats手册中所指的接口语法。也就是说,它没有定义使最后一行工作所需的隐式类

该隐式类将如下所示:

implicit class showCat(in: Cat) {
  def show: String = s"${in.name}, ${in.age}, ${in.color}"
}
显然,我没有在任何地方定义这个隐式类,这意味着它必须自动生成。我认为它必须使用某种隐式转换,将Show[Cat]实例转换为我上面创建的隐式类

但是,我不知道如何编写这个隐式类转换,我想知道是否有人可以帮助我,或者通过描述Cats库如何实现这个转换,或者通过编写实现代码来完成同样出色的工作


有关其他上下文,请参阅此处免费提供的Scala with Cats手册:

此类隐式类可能看起来像泛型类

implicit class ShowOps[A: Show](in: A) {
  def show: String = implicitly[Show[A]].show(in)
}
而不是具体的

implicit class showCat(in: Cat) {
  def show: String = s"${in.name}, ${in.age}, ${in.color}"
}
所以隐式转换不需要了解Cat

实际上是导入cats.syntax.show.\u导入类似的内容


这样的隐式类可能看起来像泛型

implicit class ShowOps[A: Show](in: A) {
  def show: String = implicitly[Show[A]].show(in)
}
而不是具体的

implicit class showCat(in: Cat) {
  def show: String = s"${in.name}, ${in.age}, ${in.color}"
}
所以隐式转换不需要了解Cat

实际上是导入cats.syntax.show.\u导入类似的内容