2017-08-09 54 views
0

我預計代碼編譯無形:爲什麼align不適用於singleton類型?

import shapeless._ 
import record._ 
import ops.record._ 
import ops.hlist.Align 
import syntax.singleton._ 

case class From(i: Int, s: String, a: Int, b: Int, c: Int) 
case class To(j: Int, s1: String, s2: String, a: Int, b: Int, c: Int) 
val f = From(1, "FROM", 1, 1, 1) 

val fromGen = LabelledGeneric[From] 
val toGen = LabelledGeneric[To] 

val lgenRepr = fromGen.to(f) 
val modified = lgenRepr.renameField('i, 'j) - 's + ('s1 ->> "S1") + ('s2 ->> "S2") 

val align = Align[modified.type, toGen.Repr] 

toGen.from(align(modified)) 

,但如果失敗,

could not find implicit value for parameter alm: shapeless.ops.hlist.Align[modified.type,toGen.Repr] 
val align = Align[modified.type, toGen.Repr] 

a trick與構建使用labelled.FieldType需要的類型,但它沒有解釋如何刪除字段,因此如果不可能使Align與singleton類型一起工作,知道如何處理這些字段將是有用的。

回答

2

問題是,modified.type有點精確...這是特定val的單一類型,而不是計算出的記錄類型。要做到這一點就REPL以下工作就好了,

@ modified.align[toGen.Repr] 
res14: toGen.Repr = 1 :: S1 :: S2 :: 1 :: 1 :: 1 :: HNil 
相關問題