传递类型参数用作参数LabelledGeneric

加布里埃·彼得罗内拉

我想参数化需要工作在通用型的方法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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

传递类型并将其用作类型参数

来自分类Dev

将类型参数用作传递给宏实现的另一个类型的类型参数时,类型错误

来自分类Dev

传递未知类型的参数

来自分类Dev

Java是否允许将类型参数用作类型参数?

来自分类Dev

调用作为参数传递的函数

来自分类常见问题

将方法引用作为参数传递

来自分类Dev

将函数调用作为参数传递

来自分类Dev

将对向量的引用作为参数传递

来自分类Dev

将函数引用作为参数传递

来自分类Dev

使用作为参数传递的函数声明

来自分类Dev

如何使用作为参数传递给方法的类类型来定义局部变量

来自分类Dev

当用作类型参数时,有没有办法将参数传递给类构造函数?

来自分类Dev

无法解析用作通用类型参数的符号

来自分类Dev

为模板传递非类型参数参数

来自分类Dev

传递属性类型作为参数

来自分类Dev

传递对象类型作为参数

来自分类Dev

XMVECTOR类型的功能参数传递

来自分类Dev

C++:将引用作为参数传递,但该函数不接受引用作为参数

来自分类Dev

该类型必须是引用类型才能用作参数

来自分类Dev

通用方法-类型不能用作类型参数

来自分类Dev

数组类型用作函数调用中的引用类型参数

来自分类Dev

错误:类型参数“ D”必须用作某些本地类型的类型参数

来自分类Dev

将字段作为参数传递与将方法调用作为参数传递有何不同?

来自分类Dev

从std :: stringstream传递std :: string引用作为参数

来自分类Dev

将对std :: ifstream的引用作为参数传递

来自分类Dev

使用作为参数传递给函数的Shell脚本代码

来自分类Dev

在C ++中将对象向量的引用作为参数传递

来自分类Dev

clearInterval.bind()不能用作传递给addEventListener的参数

来自分类Dev

如何调用作为Java的参数传递的功能?

Related 相关文章

  1. 1

    传递类型并将其用作类型参数

  2. 2

    将类型参数用作传递给宏实现的另一个类型的类型参数时,类型错误

  3. 3

    传递未知类型的参数

  4. 4

    Java是否允许将类型参数用作类型参数?

  5. 5

    调用作为参数传递的函数

  6. 6

    将方法引用作为参数传递

  7. 7

    将函数调用作为参数传递

  8. 8

    将对向量的引用作为参数传递

  9. 9

    将函数引用作为参数传递

  10. 10

    使用作为参数传递的函数声明

  11. 11

    如何使用作为参数传递给方法的类类型来定义局部变量

  12. 12

    当用作类型参数时,有没有办法将参数传递给类构造函数?

  13. 13

    无法解析用作通用类型参数的符号

  14. 14

    为模板传递非类型参数参数

  15. 15

    传递属性类型作为参数

  16. 16

    传递对象类型作为参数

  17. 17

    XMVECTOR类型的功能参数传递

  18. 18

    C++:将引用作为参数传递,但该函数不接受引用作为参数

  19. 19

    该类型必须是引用类型才能用作参数

  20. 20

    通用方法-类型不能用作类型参数

  21. 21

    数组类型用作函数调用中的引用类型参数

  22. 22

    错误:类型参数“ D”必须用作某些本地类型的类型参数

  23. 23

    将字段作为参数传递与将方法调用作为参数传递有何不同?

  24. 24

    从std :: stringstream传递std :: string引用作为参数

  25. 25

    将对std :: ifstream的引用作为参数传递

  26. 26

    使用作为参数传递给函数的Shell脚本代码

  27. 27

    在C ++中将对象向量的引用作为参数传递

  28. 28

    clearInterval.bind()不能用作传递给addEventListener的参数

  29. 29

    如何调用作为Java的参数传递的功能?

热门标签

归档