重塑一个 case class 的构造函数?
Reshape a case class constructor?
试图找到一种方法来 "reshape" 一个 case 构造函数来填充一些默认值。以下是可能的吗?
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)
是否可以使用 shapeless 还是我们必须走微距路线?
几乎可以在不更改代码或自定义类型类的情况下构建这样的整形器。我们将 prepend argument lists and then 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]
试图找到一种方法来 "reshape" 一个 case 构造函数来填充一些默认值。以下是可能的吗?
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)
是否可以使用 shapeless 还是我们必须走微距路线?
几乎可以在不更改代码或自定义类型类的情况下构建这样的整形器。我们将 prepend argument lists and then 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]