Scala 如何实现从类型类到接口语法的自动转换(Cats示例)
我正在阅读Scala with Cats一书,我想知道这个库是如何实现示例中描述的一些功能的。具体来说,它是关于使用隐式转换从现有类型类定义自动生成隐式类 我特别指的是Scala with Cats手册中的练习1.4.6。为了完整起见,我复制了下面的代码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
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导入类似的内容