gpt4 book ai didi

scala - 通用#to,但带有字段名称?

转载 作者:行者123 更新时间:2023-12-01 11:21:45 29 4
gpt4 key购买 nike

使用 Generic#to,我可以获得 case classHList 表示:

import shapeless._
case class F(x: Int, y: String)

scala> Generic[F].to( F(1, "foo") )
res1: shapeless.::[Int,shapeless.::[String,shapeless.HNil]] =
1 :: foo :: HNil

但是,我想得到以下表示:

("x", 1)::("y", "foo")::HNil

换句话说,不仅仅是 F 实例的字段值,我想获取字段名称,即 xy,以及。

我怎样才能得到这个表示?

最佳答案

您正在寻找 LabelledGeneric .

为了打印字段,您可以使用 Fields 类型类(来自 ops.record 包),它可以用 调用。 fields 如果您还导入了 record 包。

这是一个完整的例子

import shapeless._, record._, ops.record._
case class F(x: Int, y: String)

scala> LabelledGeneric[F].to(F(1, "foo")).fields
res1: shapeless.::[(Symbol with shapeless.tag.Tagged[String("x")], Int),shapeless.::[(Symbol with shapeless.tag.Tagged[String("y")], String),shapeless.HNil]] = ('x,1) :: ('y,foo) :: HNil

如果您还想将键转换为 String:

object keysToString extends Poly1 {
implicit def keyToName[A, B] = at[(Symbol with A, B)] { case (k, v) => (k.name, v) }
}

scala> LabelledGeneric[F].to(F(1, "foo")).fields.map(keysToString)
res2: shapeless.::[(String, Int),shapeless.::[(String, String),shapeless.HNil]] = (x,1) :: (y,foo) :: HNil

关于scala - 通用#to,但带有字段名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41525412/

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