【发布时间】:2019-11-21 14:46:33
【问题描述】:
我正在研究 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 一书,可在此处免费获取:https://books.underscore.io/scala-with-cats/scala-with-cats.html
【问题讨论】:
标签: scala implicit-conversion typeclass implicit scala-cats