2017-08-09 4 views
0

私はこのコードはシェイプレス:アラインメントがシングルトンタイプでは機能しないのはなぜですか?

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] 

に失敗した場合がありlabelled.FieldTypeを使用して必要なタイプを構築するとa trickがあるが、それはそうならば、フィールドを削除する方法を説明していませんAlignをシングルトンタイプで動作させることは不可能です。これらのフィールドの処理方法を知っておくと便利です。

答えて

2

問題はmodified.type少しですtoo正確...計算されたレコードタイプではなく、その特定のvaltonのシングルトンタイプです。 REPLでこれを行うには、次のように動作します。

@ modified.align[toGen.Repr] 
res14: toGen.Repr = 1 :: S1 :: S2 :: 1 :: 1 :: 1 :: HNil 
関連する問題