gpt4 book ai didi

scala - 如何获得联积的所有可能成员

转载 作者:行者123 更新时间:2023-12-04 07:56:37 24 4
gpt4 key购买 nike

我一直在尝试列出一个副产品类型的所有成员。此 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)
提前致谢。

最佳答案

它不是那么接近。在那里提取现有的键,在这里创建类型的文本表示。
你可以做

class NameHelper2[C <: Coproduct] {
def apply[L <: HList, L1 <: HList]()(
implicit
toHList: ops.coproduct.ToHList.Aux[C, L],
fillWith: ops.hlist.FillWith[nullPoly.type, L],
mapper: ops.hlist.Mapper.Aux[typeablePoly.type, L, L1],
toSet: ops.hlist.ToTraversable.Aux[L1, Set, String]): Set[String] = toSet(mapper(fillWith()))
}

object nullPoly extends Poly0 {
implicit def cse[X]: Case0[X] = at(null.asInstanceOf[X])
}

object typeablePoly extends Poly1 {
implicit def cse[X](implicit typeable: Typeable[X]): Case.Aux[X, String] = at(_ => typeable.describe)
}

关于scala - 如何获得联积的所有可能成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66672681/

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