我想参数化需要工作在通用型的方法A
为其一个LabelledGeneric
可以被检索到。这是幼稚的方法
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 <:shapeless.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的隐式值:shapeless.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
(为便于阅读,省略了结果类型)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句