假设我有一个coproduct(密封的特征),例如
sealed trait Traity
case object Foo extends Traity
case class Bar() extends Traity
case class Baz() extends Traity
使用无形,我可以将多态函数应用于特定实例,但我想要做的是将零参数(无实例)多态函数应用于所有产品(即案例类和案例对象)。我不知道语法是什么样的,但在概念上是这样的:
object mypoly extends Poly1 {
implicit def traity[T <: Traity] = when[T]( getClass[T].toString )
}
iterate[Traity](mypoly) // gives List("Foo", "Bar", "Baz")
符合我的目的。
答案 0 :(得分:15)
对于您问题中的示例用例,这实际上非常简单:
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]
然后:
scala> names[Traity]()
res0: Set[String] = Set(Bar, Baz, Foo)
(我正在使用Set
,因为您获得的顺序只是按字母顺序排列 - 目前无法按声明顺序枚举构造函数,尽管I'd personally prefer that。)
如果你想要一个更通用的答案,question I linked above中代码的改编应该不会太糟糕 - 我很乐意在以后添加它。