0
這是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
的隱式實例。爲什麼它不能滿足編譯器?
由於這是另一個問題的延續,我還沒有發佈完整的代碼。實際上,代碼摘自以下博客文章:https://meta.plasm.us/posts/2015/11/08/type-classes-and-generic-derivation/。我只添加了'NestedParser'特徵和伴隨對象以及'隱式的def nestedCaseClassParser [A,B,C]' – Haspemulator