2015-09-29 26 views
10

için objektif tanımlamak trait A tüm çocuklar için lens tanımlamak mümkün mü?Biçimsizler sonraki kod</p> <pre><code>trait A { val id: Int } case class B(id: Int) extends A case class C(id: Int, name: String) extends A </code></pre> <p>i tüm sınıf hiyerarşisi için ortak objektif tanımlamak istediğiniz sahip baz özelliği

+0

Bir kapalı MkFieldLens [A, K] sağlamak gerekir. Sorun K'yi nasıl tanımlayacağımı bilmiyorum (Symbol with shapeless.tag.Tagged [String ("id")]). Bunu kim çözdü? –

cevap

2

shapeless, A'dan Record'a örtük bir dönüşüm sağlamaz. Karşılık gelen bir kayıt türü dönüşümünü sağlamak için LabelledGeneric[A] tanımlayabilir:

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

Vay, çok teşekkürler! – lito