gpt4 book ai didi

scala - 有没有办法以通用方式将 Hlist 转换为适当的案例类?

转载 作者:行者123 更新时间:2023-12-03 21:54:12 26 4
gpt4 key购买 nike

我看过酷solution由 Travis Brown 提出,它允许以通用方式在彼此之间转换案例类。我尝试用它来转换HListcase class但没有设法让它工作。这是我的尝试:

import shapeless._, ops.hlist.Align
import syntax.std.tuple._

object Shplss extends App {
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]

type SomeType = Int :: Int :: String :: Boolean :: Int :: Int :: HNil
final case class SomeProductType(f1: Int, f2: Int, f3: String, f4: Boolean, f5: Int, f6: Int)

val some: SomeType = (4, 4, "ssdf", true, 2, 4).productElements

convertTo[SomeProductType](some)
}

不幸的是,它失败并出现错误:
Error:(22, 29) could not find implicit value for parameter genS: shapeless.LabelledGeneric.Aux[com.test.Shplss.SomeType,SR]
convertTo[SomeProductType](some)


Error:(22, 29) not enough arguments for method apply: (implicit genS: shapeless.LabelledGeneric.Aux[com.test.Shplss.SomeType,SR], implicit genT: shapeless.LabelledGeneric.Aux[com.test.Shplss.SomeProductType,TR], implicit align: shapeless.ops.hlist.Align[SR,TR])com.test.Shplss.SomeProductType in class SameFieldsConverter.
Unspecified value parameters genS, genT, align.
convertTo[SomeProductType](some)

有没有办法增强 converTo[B]函数,以便它可以在 HList 之间转换也一样?

最佳答案

无形的GenericLabelledGeneric是使用 hlists 和 coproducts 为案例类和密封特征层次结构提供通用表示的类型类。如果你已经有一个 hlist,你真的不需要 Generic例如,Shapeless 没有提供。在您的情况下,这意味着您实际上可以跳过 genSSR部分:

import shapeless._, ops.hlist.Align
import syntax.std.tuple._

object Shplss extends App {
class SameFieldsConverter[T] {
def apply[S <: HList, TR <: HList](s: S)(implicit
genT: Generic.Aux[T, TR],
align: Align[S, TR]
) = genT.from(align(s))
}

def convertTo[T] = new SameFieldsConverter[T]

type SomeType = Int :: Int :: String :: Boolean :: Int :: Int :: HNil
final case class SomeProductType(f1: Int, f2: Int, f3: String, f4: Boolean, f5: Int, f6: Int)

val some: SomeType = (4, 4, "ssdf", true, 2, 4).productElements

convertTo[SomeProductType](some)
}

这会给你 SomeProductType(4,4,ssdf,true,2,4) ,如你所料。

请注意,我已更改 genT来自 LabelledGenericGeneric ,因为我们不再需要在输入端对齐标签。我想你可以添加一些额外的机器来将未标记的输入“注入(inject)”到无形记录中以匹配 LabelledGeneric类型,但在这个特定的用例中,至少没有任何意义。

关于scala - 有没有办法以通用方式将 Hlist 转换为适当的案例类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62085387/

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