gpt4 book ai didi

scala - Shapeless - 将一个案例类转换为另一个具有不同顺序字段的案例类

转载 作者:行者123 更新时间:2023-12-03 01:14:46 24 4
gpt4 key购买 nike

我正在考虑做类似 Safely copying fields between case classes of different types 的事情但字段重新排序,即

case class A(foo: Int, bar: Int)
case class B(bar: Int, foo: Int)

我想要一些东西来变成 A(3, 4)进入B(4, 3) - 无形'LabelledGeneric然而我想到了

LabelledGeneric[B].from(LabelledGeneric[A].to(A(12, 13)))

结果

<console>:15: error: type mismatch;
found : shapeless.::[shapeless.record.FieldType[shapeless.tag.@@[Symbol,String("foo")],Int],shapeless.::[shapeless.record.FieldType[shapeless.tag.@@[Symbol,String("bar")],Int],shapeless.HNil]]
(which expands to) shapeless.::[Int with shapeless.record.KeyTag[Symbol with shapeless.tag.Tagged[String("foo")],Int],shapeless.::[Int with shapeless.record.KeyTag[Symbol with shapeless.tag.Tagged[String("bar")],Int],shapeless.HNil]]
required: shapeless.::[shapeless.record.FieldType[shapeless.tag.@@[Symbol,String("bar")],Int],shapeless.::[shapeless.record.FieldType[shapeless.tag.@@[Symbol,String("foo")],Int],shapeless.HNil]]
(which expands to) shapeless.::[Int with shapeless.record.KeyTag[Symbol with shapeless.tag.Tagged[String("bar")],Int],shapeless.::[Int with shapeless.record.KeyTag[Symbol with shapeless.tag.Tagged[String("foo")],Int],shapeless.HNil]]
LabelledGeneric[B].from(LabelledGeneric[A].to(A(12, 13)))
^

如何对记录中的字段重新排序(?)以便可以使用最少的样板文件?

最佳答案

我应该把这个留给迈尔斯,但这是我来自的欢乐时光,我无法抗拒。正如他在上面的评论中指出的那样,关键是 ops.hlist.Align,它对于记录来说效果很好(毕竟它们只是特殊的 hlist)。

如果你想要一个好的语法,你需要使用如下的技巧来将类型参数列表与目标(你想要显式提供)与类型参数列表与所有其他东西(你想要的)分开待推断):

import shapeless._, ops.hlist.Align

class SameFieldsConverter[T] {
def apply[S, SR <: HList, TR <: HList](s: S)(implicit
genS: LabelledGeneric.Aux[S, SR],
genT: LabelledGeneric.Aux[T, TR],
align: Align[SR, TR]
) = genT.from(align(genS.to(s)))
}

def convertTo[T] = new SameFieldsConverter[T]

然后:

case class A(foo: Int, bar: Int)
case class B(bar: Int, foo: Int)

然后:

scala> convertTo[B](A(12, 13))
res0: B = B(13,12)

请注意,对于大型案例类,在编译时查找对齐实例的成本会很高。

关于scala - Shapeless - 将一个案例类转换为另一个具有不同顺序字段的案例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29242873/

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