2014-01-22 7 views
6

ich eine einfache rekursive polymorphe Funktion schreiben:Wie kann ich schreiben eine rekursive polymorphe Funktion mit Shapeless

object simpleRec extends Poly1 { 
    implicit def caseInt = at[Int](identity) 
    implicit def caseList[A, B](implicit ev: simpleRec.Case.Aux[A, B]) = 
    at[List[A]](_.headOption.map(simpleRec)) 
} 

Dies scheint weitgehend zu tun, was ich will; aber ich scheine einen unsinniges Ergebnis Typen bekommen:

scala> simpleRec(List.empty[List[Int]]) 
res3: Option[B] = None 

scala> simpleRec(List(List(1))) 
res4: Option[B] = Some(Some(1)) 

Wie kann ich das machen gib mir Werte von Option[Option[Int]] anstatt Option[B]? Ich erwarte, dass ich hier einen dummen Fehler mache, aber ich kann nicht herausfinden, was es ist.

+0

Dies ist eine nette Frage. Meine reflexive Antwort war "benutze einfach Case [A]' ", was dir den richtigen abgeleiteten Typ gibt, aber das macht merkwürdige Sachen in z. 'simpleRec (Liste (Liste (1))): Option [Option [Int]]'. –

+0

Können Sie den gesamten Code einfügen? – nathanengineer

Antwort

2

Dies ist wahrscheinlich ein Fehler war, der folgende Code funktioniert wie erwartet:

object simpleRec extends Poly1 { 
    implicit def caseInt = at[Int](identity) 
    implicit def caseList[A](implicit ev: simpleRec.Case[A]) = 
    at[List[A]](_.headOption.map(simpleRec)) 
} 

Mit shapeless_2.11-2.0.0

Verwandte Themen