【问题标题】:How to implement automatic conversion from type class to interface syntax (Cats example)如何实现从类型类到接口语法的自动转换(Cats 示例)
【发布时间】: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


    【解决方案1】:

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

    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

    实际上使用import cats.syntax.show._ 你导入了类似的东西。

    https://github.com/typelevel/cats/blob/master/core/src/main/scala/cats/syntax/package.scala#L55

    https://github.com/typelevel/cats/blob/master/core/src/main/scala/cats/syntax/show.scala

    https://github.com/typelevel/cats/blob/master/core/src/main/scala/cats/Show.scala#L23-L34

    【讨论】:

      猜你喜欢
      • 2011-04-22
      • 2017-02-16
      • 1970-01-01
      • 2014-11-28
      • 1970-01-01
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 2015-05-18
      相关资源
      最近更新 更多