Shapeless-使用LabelledGeneric从案例类中以编程方式删除字段

时间:2019-03-12 09:58:45

标签: scala shapeless

我在使用LabelledGeneric转换为案例类时遇到问题

下面是我的代码的简化示例:

import shapeless._
import shapeless.record._

  def removeKeys[
    F <: Product,
    T <: Product,
    HF <: HList,
    HT <: Product
  ](
    from: F,
    removeField: String
  )(
    implicit genericFrom: LabelledGeneric.Aux[F, HF],
    genericTo: LabelledGeneric.Aux[T, HT]
  ): T = {
    val hListFrom = genericFrom.to(from) 
    val hListTo = hListFrom - Witness(removeField) // Missing implicit Remover 
    genericTo.from(hListTo) // If I remove multiple fields in a say foldLeft how do I ensure the resulting HList is of type HT?
  }

我显然想念一个卸妆器-考虑到我最终想要在一组标签上折叠以删除hListFrom,我应该怎么想起?

我的最终意图是从案例类T中选择存在于案例类T上的所有具有相同类型的字段。

例如,给定:

case class A(a: Int, b: Double, c: Boolean)
case class B(b: Double, c: Boolean)

我想要

def f[F <: Product, T <: Product](cc: F): T

使f(A(1, 1.0, true))返回B(1.0, true)

我想我需要两个HList的交集,但是我刚刚想到,我可能需要根据输出用例类构造函数参数的顺序对此进行重新排序。

我很喜欢学习Shapeless,但是学习曲线相当陡峭,许多示例倾向于省略有关如何确保将隐式传递给通用代​​码的细节。

0 个答案:

没有答案