Type参数中`::`的含义?

时间:2016-07-30 03:21:29

标签: scala shapeless

看看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 :: TParser[H :: T]的含义是什么?

此外,case cell +: rest如何处理s,即输入apply为空的情况?

1 个答案:

答案 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永远不会遇到空列表。