【发布时间】:2020-12-13 20:04:51
【问题描述】:
假设我有一个案例类:
case class Foo(num: Int, str: String, bool: Boolean)
现在我还有一个简单的包装器:
sealed trait Wrapper[T]
case class Wrapped[T](value: T) extends Wrapper[T]
(以及其他一些在这里不重要的 Wrapper 实现)
我可以使用 Generic[Foo] 来获得一个代表这个案例类的 Aux:
val genFoo = Generic[Foo]
(在我的真实代码中,我使用 LabelledGeneric 以免丢失字段名称)
这为我提供了一个表示 HList 的定义的类型:
Generic.Aux[Foo, Int :: String :: Boolean :: HNil]
(与 LabelledGeneric 一起使用时,定义要复杂得多,但本质相同)
现在我想为 HList 创建一个类型定义,而不是原始类型,而是包含包装类型。示例:
type WrappedHlist = Wrapper[Int] :: Wrapper[String] :: Wrapper[Boolean] :: HNil
然后我可以使用这个类型定义来生成一个 Circe 编码器/解码器(我已经为 Wrapper 类型提供了必要的编码器/解码器)。
所有必要的信息都存在于编译时,因为第二个 HList 的定义很容易从第一个中确定。现在,我可以通过手动写出定义来实现这一点,或者通过使用冗余版本重复案例类 Foo 的定义,其中所有内容都定义为 Wrappers。如何创建一个不需要我重复所有内容的定义?
【问题讨论】: