gpt4 book ai didi

scala - 如何使用无形来迭代联产品中的所有产品类型?

转载 作者:行者123 更新时间:2023-12-04 03:15:22 24 4
gpt4 key购买 nike

假设我有一个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")

会适合我的目的。

最佳答案

对于您问题中的示例用例,这实际上非常简单:

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中的代码进行的修改应该不会太糟糕-我很乐意稍后再将其添加到此处。

关于scala - 如何使用无形来迭代联产品中的所有产品类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29676204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com