【发布时间】:2021-03-17 12:00:35
【问题描述】:
我一直在尝试列出联产品类型的所有成员。这个answer 真的很接近我想要达到的目标:
sealed trait Traity
case object Foo extends Traity
case class Bar() extends Traity
case class Baz() extends Traity
import shapeless._
class NameHelper[A] {
def apply[C <: Coproduct, K <: HList]()(
implicit
gen: LabelledGeneric.Aux[A, C],
keys: ops.union.Keys.Aux[C, K],
toSet: ops.hlist.ToTraversable.Aux[K, Set, Symbol]): Set[String] = toSet(keys()).map(_.name)
}
def names[A] = new NameHelper[A]
names[Traity]()
预期输出:
res0: Set[String] = Set(Bar, Baz, Foo)
但我的源类型不是密封特性,它是原始无形的副产品。我尝试了以下方法,但无法编译:
type ISB = Int :+: String :+: Boolean :+: CNil
class NameHelper2[A <: Coproduct] {
def apply[K <: HList]()(
implicit
keys: ops.union.Keys.Aux[A, K],
toSet: ops.hlist.ToTraversable.Aux[K, Set, Symbol]): Set[String] = toSet(keys()).map(_.name)
}
def names2[A <: Coproduct] = new NameHelper2[A]
names2[ISB]()
结果是一个缺失的隐含值:
could not find implicit value for parameter keys: shapeless.ops.union.Keys.Aux[ISB,K]
names2[ISB]()
我想要的是可能的副产品成员:Set(Int, String, Boolean)
提前致谢。
【问题讨论】: