2015-11-12 11 views
5

いくつかのデフォルト値を満たすためにケースコンストラクタを「再形成」する方法を見つけようとしています。次のことが可能ですか?ケースクラスのコンストラクタを変更しますか?

def reshape[T, R1 <: HList, R2 <: HList](h: R1): R2 => T = ??? 

//example 
case class MyClass(a: Double, b: String, c: Int) 

val newConstructor = reshape[MyClass]('b ->> "bValue" :: HNil) 

newConstructor('a ->> 3.1 :: 'c ->> 4 :: HNil) 
res1: MyClass = MyClass(3.1, "bValue", 4) 

シェイプレスでもマクロルートにする必要はありますか?

答えて

7

コードやカスタムタイプメーターに変更を加えることなく、ほぼ同じように再構成することができます。私達はちょうどprepend引数リストをし、その後align結果LabelledGeneric[MyClass]#Reprへ:

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

class PartialConstructor[C, Default <: HList, Repr <: HList] 
(default: Default) 
(implicit lgen: LabelledGeneric.Aux[C, Repr]) { 
    def apply[Args <: HList, Full <: HList] 
    (args: Args) 
    (implicit prepend: Prepend.Aux[Default, Args, Full], 
    align: Align[Full, Repr]): C = 
    lgen.from(align(default ++ args)) 
} 

class Reshaper[C]() { 
    def apply[Default <: HList, Repr <: HList] 
    (default: Default) 
    (implicit lgen: LabelledGeneric.Aux[C, Repr]) = 
    new PartialConstructor[C, Default, Repr](default) 
} 

def reshape[C] = new Reshaper[C] 
+0

ありがとう!前置詞と揃えは確かに何を探しています。 – KailuoWang

関連する問題