如何在 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()
}
有谁知道为什么更高种类的类型无效?
我创建了一个玩具示例来说明我不理解的编译器错误。从 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()
}
有谁知道为什么更高种类的类型无效?