我正在阅读关于解析器的泛型推导的blog post。该帖子显示了如何定义Parser[H :: T]
给定Parser[H]
和Parser[T]
,其中T
是HList
的子类型:
implicit def hconsParser[H: Parser, T <: HList: Parser]: Parser[H :: T] =
new Parser[H :: T] {
def apply(s: String): Option[H :: T] = s.split(",").toList match {
case cell +: rest => for {
head <- implicitly[Parser[H]].apply(cell)
tail <- implicitly[Parser[T]].apply(rest.mkString(","))
} yield head :: tail
}
}
该帖子还定义了Parser[HNil]
作为基本案例。
不幸的是我不明白编译器如何找到Parser[T]
。我们没有为Parser[T]
定义解析器T <: HList
。我们只定义了Parser[H :: T]
。编译器是否知道Parser[T]
实际上是Parser[H1 :: T1]
?它是如何知道的?