通过父类型获取类型类实例

syn*_*pse 1 scala implicit typeclass

我需要为一堆全部派生自单个特征的案例类提供类型类实例,但据我了解,Scala 编译器需要特定类的实例,并且不会沿继承层次结构上升。所以这段代码:

trait Base

sealed trait Child extends Base

case class Concrete() extends Child

trait Printable[A] {
  def print(value: A): String
}

object WtfTrait {
  def print[A](x: A)(implicit ev: Printable[A]) = {
    println(ev.print(x))
  }

  implicit val printableBase = new Printable[Base] {
    override def print(value: Base): String = value.toString
  }

  val x = Concrete()
  print(x)
}
Run Code Online (Sandbox Code Playgroud)

编译时不会出现错误读取could not find implicit value for parameter ev: Printable[Impl]。有没有办法为基本特征定义单个类型类实例,并通过使用 Shapeless 或其他东西来避免重复。

cch*_*tep 5

猜猜你的意思是Printable[Concrete](也就是说一个Show类型类实例)。

需要更新printableBase定义如下:

trait Base

sealed trait Child extends Base

case class Concrete() extends Child

trait Printable[A] {
  def print(value: A): String
}

object WtfTrait {
  def print[A](x: A)(implicit ev: Printable[A]) = {
    println(ev.print(x))
  }

  // HERE
  implicit def printableBase[T <: Base] = new Printable[T] {
    override def print(value: T): String = value.toString
  }

  val x = Concrete()
  print(x)
}
Run Code Online (Sandbox Code Playgroud)