【问题标题】:Scala: Convert a Sealed Trait instance to an HListScala:将 Sealed Trait 实例转换为 HList
【发布时间】:2016-07-21 07:35:10
【问题描述】:

考虑以下几点:

sealed trait baseData {
  def weight: Int
  def priority: Int
} 

case class data1(override val weight: Int, override val priority: Int) extends baseData

如何定义具有以下签名的函数,将data1 转换为 HList?

def toHlist[A <: baseData] (data: A) = {}

我想将一个特征实例传递给toHlist 函数而不是实际的案例类,因为将有多个案例类扩展该特征。我也不想硬编码任何字段;我正在寻找一个完全通用的解决方案。

我确信使用 Shapeless 库可以做到这一点,但无法弄清楚如何。

编辑

toHList 需要能够处理指向案例类实例的baseData 指针,如下所示:

val data: baseData = data1(1,2)
toHlist(data) 

这样做的原因是,我们将拥有多个扩展 baseData 的案例类,现在我们将知道在运行之前将哪一个传递给 toHlist

【问题讨论】:

    标签: scala generics shapeless


    【解决方案1】:

    这可能不是最终答案,但它会帮助你完善你的问题,

    scala> def toHlist[A <: baseData](data: A)(implicit gen: Generic[A]): gen.Repr = gen.to(data)
    toHlist: [A <: baseData](data: A)(implicit gen: shapeless.Generic[A])gen.Repr
    
    scala> toHlist(data1(23, 13))
    res0: shapeless.::[Int,shapeless.::[Int,shapeless.HNil]] = 23 :: 13 :: HNil
    

    【讨论】:

    • 谢谢!这适用于toHlist(data1(23, 13)),但如果我们只有一个指向基本特征的指针,则不会:val data: baseData = data1(23,13)toHlist(data)。就我而言,直到运行时我才知道要传入哪个案例类。有什么想法吗?
    • 您能否根据上述情况更新您的问题?
    • 见上文。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-07
    • 1970-01-01
    • 2018-08-30
    相关资源
    最近更新 更多