2015-09-29 8 views
10

mam następny kodShapeless określić obiektyw dla podstawowej cechy

trait A { val id: Int } 
case class B(id: Int) extends A 
case class C(id: Int, name: String) extends A 

chcę definiować wspólne obiektyw dla całej klasy hierarchii:

import shapeless._ 
import lens._ 
val idLens = lens[A] >> 'id 

ale pojawia się błąd: could not find implicit value for parameter mkLens: shapeless.MkFieldLens[A,Symbol with shapeless.tag.Tagged[String("id")]]

Czy można zdefiniować obiektyw dla wszystkich dzieci z trait A?

+0

trzeba zapewnić Pośrednia MkFieldLens [a, K]. Problem polega na tym, że nie wiem jak określić K (Symbol z shapeless.tag.Tagged [String ("id")]). Ktoś to rozwiązał? –

Odpowiedz

2

bezkształtne nie zapewnia niejawna konwersja z A do Record. można zdefiniować LabelledGeneric[A] otrzymując odpowiednią konwersję typ rekordu:

import shapeless._ 
import lens._ 
import record._ 
import syntax.singleton._ 

trait A { val id: Int } 
case class B(id: Int) extends A 
case class C(id: Int, name: String) extends A 

implicit val lgenA = new LabelledGeneric[A] { 
    type Repr = Record.`'id -> Int`.T 
    def to(a: A) : Repr = ('id ->> a.id) :: HNil 
    def from(r: Repr): A = new A { val id = r('id) } 
} 

val idLens = lens[A] >> 'id 

val b = B(7) 
println(idLens.get(b)) // 7 
+0

wow, wielkie dzięki! – lito