传递要用作参数 LabelledGeneric 的类型参数



我正在尝试参数化一种方法,该方法需要在可以检索其LabelledGeneric的泛型类型A上工作。这是幼稚的方法

case class Foo(bar: String, baz: Boolean)
def params[A](a: A) = {
  val lbl = LabelledGeneric[A]
  val keys = Keys[lbl.Repr].apply
  ...
}
val myThingy = params(Foo)

当然,底层宏抱怨。它对A不够了解:

A型不是类或特征


所以,我试图推断出LabelledGeneric

def params[A](a: A)(implicit lbl: LabelledGeneric[A]) = {
  val keys = Keys[lbl.Repr].apply
  ...
}

这似乎有效,但Repr类型不再是一个HList

类型参数 [LBL.Repr] 不符合方法应用的类型参数边界 [L <:无形。HList]


好的,让我们尝试更精确

def params[A, Repr <: HList](a: A)(implicit lbl: LabelledGeneric.Aux[A, Repr]) = {
  val keys = Keys[lbl.Repr].apply
  ...
}

现在,Repr绝对是一个HList,但仍然Keys无法解决其隐含问题。

找不到参数值的隐式值:shapeless.ops.record.Values[lbl.Repr]


最后一次尝试,让我们尝试隐式计算我需要的一切

def params[A, Repr <: HList](a: A)(implicit
  lbl: LabelledGeneric.Aux[A, Repr],
  kk: Keys[Repr]
) = {
  val keys = kk.apply
  ...
}

仍然没有运气,显然第一个隐式无法在调用站点解决

找不到参数 LBL 的隐式值:无形状。LabelledGeneric.Aux[example.Main.Foo.type,Repr]

[错误] 参数(Foo(

显然,当直接处理特定类型时,所有这些机器都有效,例如

val lbl = LabelledGeneric[Foo]
val keys = Keys[lbl.Repr].apply
// no problem

我显然缺少方法签名中对我的类型进行所需的一组改进,但我可以了解这里发生了什么。知道吗?

最后一个包含所有计算内容的变体隐式地为我工作,

scala> import shapeless._, ops.record._
import shapeless._
import ops.record._
scala> :paste
// Entering paste mode (ctrl-D to finish)
def params[A, Repr <: HList](a: A)
  (implicit lbl: LabelledGeneric.Aux[A, Repr], kk: Keys[Repr]) = {
  val keys = kk.apply
  keys
}
// Exiting paste mode, now interpreting.
params: ...
scala> case class Foo(bar: String, baz: Boolean)
defined class Foo
scala> params(foo)
res0: ... = 'bar :: 'baz :: HNil

(为了便于阅读,省略了结果类型(。

相关内容

  • 没有找到相关文章

最新更新