我正在尝试从this blog post扩展Parser
类型类以支持嵌套的案例类解析。由于我是新手,我决定从非一般情况开始,这只会支持一个包含2个字段的案例类,这些字段本身就是案例类。为了更好地说明这一点,首先是案例类定义:
case class Person(name: String, age: Int)
case class Family(husband: Person, wife: Person)
除了该博客文章的代码之外,我还创建了一个本应支持我的案例的隐式函数,通过将字符串划分为Family
来解析"Hans,70|Emmy,60"
类。 2 '|'
部分,然后独立解析这2个独立的部分,最后组合结果。这是它的样子:
implicit def nestedCaseClassParser[A, B, C]
(
implicit pb: Parser[B],
pc: Parser[C],
gen: Generic.Aux[A, B :: C :: HNil]
): Parser[A] = new Parser[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)
}
}
然后,当我试图像这样解析它时:
val p = Parser.apply[Family]("hello,1|hello,1")
我收到以下编译错误:
<console>:83: error: diverging implicit expansion for type Parser[Family]
starting with method nestedCaseClassParser in object Parser
val p = Parser.apply[Family]("hello,1|hello,1")
^
我不是要求完全解决完全通用嵌套案例类解析的问题,因为我很想自己找到它,但我真的很感谢这个代码出了什么问题的解释,以及我怎样才能在这个简单的层面上发挥作用。
编辑:由于我已经克服了最初的问题,因此我为下一步遇到的问题创建了separate questions。