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 或其他东西来避免重复。
猜猜你的意思是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)