如何在 Scala 中为 Traversable 的任何子类创建类型类实例

How to create a typeclass instance for any subclass of Traversable in Scala

我创建了一个玩具示例来说明我不理解的编译器错误。从 C[_] <: Traversable[T]Safe[T]Safe[C[T]] 的隐式转换不应该适用吗?

import scala.language.{implicitConversions, higherKinds}

class ToyExample {

  implicit val stringsafe = new Safe[String] {
    override def stringify(value: String): String = value
  }

  def main(args: Array[String]): Unit = {
    val a: String = "c"
    val b: Seq[String] = Seq("1", "2", "3")
    safe(a)
    safe(b)  // why is this a compiler error?
  }

  def safe[T](value: T)(implicit safe: Safe[T]): String = safe stringify value
}

object Safe {

  implicit def safeTraversable[C[_] <: Traversable[T], T](implicit safe: Safe[T]): Safe[C[T]] =
    new Safe[C[T]] {
      override def stringify(value: C[T]): String = value.map(safe.stringify).toString()
    }
}

trait Safe[T] {

  def stringify(value: T): String
}

好的,所以我想出了如何让代码编译,但我不明白原因。

通过修改隐式转换以删除更高种类的占位符,我能够编译它:

implicit def safeTraversable[C <: Traversable[T], T](implicit safe: Safe[T]): Safe[C] =
    new Safe[C] {
      override def stringify(value: C): String = value.map(safe.stringify).toString()
    }

有谁知道为什么更高种类的类型无效?