看看Travis Brown在Type classes and generic derivation上的优秀博文,我看到以下方法:
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
}
}
H :: T
中Parser[H :: T]
的含义是什么?
此外,case cell +: rest
如何处理s
,即输入apply
为空的情况?
答案 0 :(得分:9)
H :: T
是::[H, T]
类型的中缀形式,它是HList
,其头部类型为H
,尾部类型为T <: HList
。即我们正在为类型Parser
寻找::[H, T]
。
中缀的使用是这样实现的,其中infix
可以是任何名称:
scala> trait infix[A, B]
scala> def test[A, B](ab: A infix B) = ???
test: [A, B](ab: infix[A,B])Nothing
此外,
case cell +: rest
如何处理s
,即输入apply
为空的情况?
如果s
是一个空字符串,那么s.split(",").toList
将只是一个List
,其中一个空字符串作为其单个元素。 case cell +: rest
永远不会遇到空列表。