首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从FieldType中提取HList密钥和值

从FieldType中提取HList密钥和值
EN

Stack Overflow用户
提问于 2017-09-16 22:55:10
回答 1查看 336关注 0票数 1

我想使用以下两种方法提取HList头部的键和值:

代码语言:javascript
复制
def getFieldName[K, V](value: FieldType[K, V])(implicit witness: Witness.Aux[K]): K = witness.value
def getFieldValue[K, V](value: FieldType[K, V]): V = value

我尝试过这个函数的几个变体,但我无法使它工作,我认为这可能是最接近正确的解决方案:

代码语言:javascript
复制
def getFieldNameValue[Key <: Symbol, Value <: AnyRef, Y <: HList, A <: Product](a : A)
                       (implicit 
                        gen : LabelledGeneric.Aux[A, FieldType[Key, Value] :: Y],
                        witness: shapeless.Witness.Aux[Key]) = {
    val aGen = gen.to(a).head
    (getFieldName(aGen), getFieldValue(aGen))
  }

但是它抛出了这个异常:

代码语言:javascript
复制
could not find implicit value for parameter gen: shapeless.LabelledGeneric.Aux[Ex,shapeless.labelled.FieldType[Key,Value] :: Y]

我想这样称呼它:

代码语言:javascript
复制
scala> case class Ex(i: Int, ii: Int)
scala> val ex = Ex(1,2)
scala> getFieldNameValue(ex)
res1: (String, Int) = (i,1)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-17 07:52:22

这个变体起作用了:

代码语言:javascript
复制
  def getFieldNameValue[A <: Product, Repr <: HList,
                        K <: Symbol, V, T <: HList](a: A)(implicit 
    gen: LabelledGeneric.Aux[A, Repr],
    ev: Repr <:< (FieldType[K, V] :: T),
    witness: Witness.Aux[K]): (String, V) = {
    val record: Repr = gen.to(a)
    (witness.value.name, record.head)
  }

  getFieldNameValue(ex) // (i,1)

我想问题是你一步就做了太多的工作(请不要这样说)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46259168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档