Scala类型类找不到隐式实例

时间:2016-01-15 02:44:35

标签: scala functional-programming

我正在尝试在Scala中创建一个类型类,并使用它来创建一个简单的多态案例类。此示例不编译并给出“找不到参数writer的隐式值:A $ A228.this.ValueWriter [T]”。我无法弄清楚可能出现的问题或从哪里开始。

trait Keeper

case class StringKeeper(measure: String) extends Keeper

case class StringLengthKeeper(measure: Int) extends Keeper


trait ValueWriter[A] {
  def write(value: String): A
}

object DefaultValueWriters {
  implicit val stringWriter = new ValueWriter[StringKeeper] {
    def write(value: String) = StringKeeper(value)
  }
  implicit val stringLengthWriter = new ValueWriter[StringLengthKeeper] {
    def write(value: String) = StringLengthKeeper(value.length)
  }
}

object Write {
  def toWrite[A](value: String)(implicit writer: ValueWriter[A]) = {
    writer.write(value)
  }
}


case class WriterOfKeepers[T <: Keeper](value: String) {

  def run: T = {
    Write.toWrite[T](value)
  }

}

import DefaultValueWriters._

val writerLengthKeeper = WriterOfKeepers[StringLengthKeeper]("TestString")

writerLengthKeeper.run

1 个答案:

答案 0 :(得分:1)

当您致电ValueWriter时,范围内没有隐式Write.toWrite

您需要在构造函数

中包含隐含参数
case class WriterOfKeepers[T <: Keeper : ValueWriter](value: String) {

  def run: T = {
    Write.toWrite[T](value)
  }

}

或方法

case class WriterOfKeepers[T <: Keeper](value: String) {

  def run(implicit writer: ValueWriter[T]): T = {
    Write.toWrite(value)
  }

}

或找到一些与您的要求兼容的其他方式(我不知道那些)。