2016-07-30 10 views
4

Mit Blick auf Travis Brown ausgezeichnete Blog-Post auf Type classes and generic derivation, sehe ich die folgende Methode:Bedeutung von `::` in Type Parameter?

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 
    } 
    } 

Was ist die Bedeutung von H :: T in Parser[H :: T]?

Auch, wie behandelt diese case cell +: rest den Fall, wo s, d. H. Eingabe in apply ist leer?

Antwort

9

H :: T ist die Infix-Form des Typs ::[H, T], die ein HList mit einem Kopf des Typs mit Typ H und Schwanz T <: HList ist. Wir suchen nach einer Parser für den Typ ::[H, T].

Die Infix Nutzung wie dies erreicht ist, wo infix ein beliebiger Name sein kann:

scala> trait infix[A, B] 

scala> def test[A, B](ab: A infix B) = ??? 
test: [A, B](ab: infix[A,B])Nothing 

Auch wie funktioniert die case cell +: rest den Fall behandeln, in denen s, das heißt Eingang apply leer ist?

Wenn s eine leere Zeichenfolge ist, dann s.split(",").toList wird einfach ein List mit einem leeren String als einzelnes Element sein. case cell +: rest würde dann nie in eine leere Liste laufen.