Gab*_*lla 8 scala shapeless labelled-generic
我想参数化,需要在通用型工作的方法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)
Run Code Online (Sandbox Code Playgroud)
当然,潜在的宏抱怨.它不够了解A:
类型A不是类或特征
所以,我试着LabelledGeneric推断
def params[A](a: A)(implicit lbl: LabelledGeneric[A]) = {
val keys = Keys[lbl.Repr].apply
...
}
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但Repr不再知道这种类型HList了
类型参数[lbl.Repr]不符合方法apply的类型参数bounds [L <:shapeless.HList]
好吧,让我们试着更精确
def params[A, Repr <: HList](a: A)(implicit lbl: LabelledGeneric.Aux[A, Repr]) = {
val keys = Keys[lbl.Repr].apply
...
}
Run Code Online (Sandbox Code Playgroud)
现在,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
...
}
Run Code Online (Sandbox Code Playgroud)
仍然没有运气,显然第一个隐含的无法在呼叫站点解决
找不到参数lbl的隐含值:shapeless.LabelledGeneric.Aux [example.Main.Foo.type,Repr]
[错误] params(Foo)
显然,当直接处理特定类型时,所有这些机器都可以工作
val lbl = LabelledGeneric[Foo]
val keys = Keys[lbl.Repr].apply
// no problem
Run Code Online (Sandbox Code Playgroud)
我在方法签名中明显缺少我的类型所需的一组改进,但我可以理解这里发生的事情.任何的想法?
包含所有计算内容的最后一个变体对我有用,
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
Run Code Online (Sandbox Code Playgroud)
(结果类型省略了可读性).
| 归档时间: |
|
| 查看次数: |
639 次 |
| 最近记录: |