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

时间:2015-04-26 01:58:08

标签: scala typeclass implicit

我已经创建了一个玩具示例来说明我不理解的编译器错误。不应该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
}

1 个答案:

答案 0 :(得分:2)

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

通过修改隐式转换以删除更高级别的占位符,我能够将其编译为:

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()
    }

有谁理解为什么较高的kinded类型无效?