未找到类型类的隐式方法

时间:2015-11-20 14:07:32

标签: scala typeclass shapeless

这是Diverging implicit expansion for type class的延续。我想出了另一个仍然无法编译的版本,但现在出于另一个原因,因此是一个不同的问题。这是我做的:

我基本上为一些案例类包含其他案例类的情况添加了一个新的类型类NestedParser

trait Parser[A] {
  def apply(s: String): Option[A]
}
trait NestedParser[A] {
  def apply(s: String): Option[A]
}

object Parser {
  def apply[A](s: String)(implicit parser: Parser[A]): Option[A] = parser(s)
}
object NestedParser {
  def apply[A](s: String)(implicit parser: NestedParser[A]): Option[A] = parser(s)
}

我已经更改了之前的隐式函数以返回NestedParser以避免偏离隐式扩展。否则它和以前一样:

implicit def nestedCaseClassParser[A, B, C]
  (
    implicit pb: Parser[B],
    pc: Parser[C],
    gen: Generic.Aux[A, B :: C :: HNil]
  ): NestedParser[A] = new NestedParser[A] {
    override def apply(s: String): Option[A] = {
      val tmp = s.span(_ != '|') match {
        case (h, t) =>
          for {
            a <- pb(h)
            b <- pc(t.substring(1))
          } yield a :: b :: HNil
      }
      tmp.map(gen.from)
    }
  }

案例类与以前相同:

case class Person(name: String, age: Int)
case class Family(husband: Person, wife: Person)

现在,当我尝试解析Family时,我收到以下编译错误:

scala> NestedParser[Family]("")
<console>:32: error: could not find implicit value for parameter parser: NestedParser[Family]
       NestedParser[Family]("")

然而,这对我没有意义。上面的函数清楚地提供了NestedParser的隐式实例。为什么它不满足编译器?

1 个答案:

答案 0 :(得分:0)

好吧,据我所知,您没有提供Parser所需的任何隐式nestedCaseClassParser实例。