如何为非密封Trait的Coproduct自动推导Shapeless LabelledGeneric
为非密封Trait的Coproduct自动推导LabelledGeneric的实现思路
我尝试为Coproduct生成LabelledGeneric,以此替代常规的sealed trait继承体系。目前已通过显式指定DefaultSymbolicLabelling的标签实现该功能,但认为应可直接从Coproduct的类型成员自动推导,无需手动定义标签及相关实例。
手动实现代码示例
/** * So far I found no way to derive `L` and `l` from `C`. */ object ShapelessLabelledGenericForCoproduct extends App { trait Base // not sealed! case class Case1(a: Int) extends Base case class Case2(a: String) extends Base case class Case3(b: Boolean) extends Base object Base { type C = Case1 :+: Case2 :+: Case3 :+: CNil type L = (Symbol @@ "Case1") :: (Symbol @@ "Case2") :: (Symbol @@ "Case3") :: shapeless.HNil val l: L = tag["Case1"](Symbol("Case1")) :: tag["Case2"](Symbol("Case2")) :: tag["Case3"](Symbol("Case3")) :: HNil implicit def myGeneric: Generic.Aux[Base, C] = Generic.instance[Base, C]( v => Coproduct.runtimeInject[C](v).get, v => Coproduct.unsafeGet(v).asInstanceOf[Base] ) implicit def mySymbolicLabelling: DefaultSymbolicLabelling.Aux[Base, L] = DefaultSymbolicLabelling.instance[Base, L](l) } val lgen = LabelledGeneric[Base] val repr = lgen.to(Case1(123)) println(lgen.from(repr)) }
密封Trait自动推导的参考代码(期望非密封Trait实现类似效果)
object ShapelessLabelledGenericForSealedTrait extends App { sealed trait Base case class Case1(a: Int) extends Base case class Case2(a: String) extends Base case class Case3(b: Boolean) extends Base val lgen = LabelledGeneric[Base] val repr = lgen.to(Case1(123)) println(lgen.from(repr)) }
我已查阅Shapeless宏代码,但未找到有用线索,求相关实现思路?
内容的提问来源于stack exchange,提问作者user3663733
相关产品推荐
相关产品推荐

