首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HList变换输出型

HList变换输出型
EN

Stack Overflow用户
提问于 2017-11-02 01:06:31
回答 1查看 105关注 0票数 0

我已经在HList上创建了一个包装器,它可以附加一个HLists。它的定义如下:

代码语言:javascript
复制
class HListWrapper[L <: HList](val hl: L) {
  def append[V, Out <: HList](k: Witness, v: V)(implicit updater: Updater.Aux[L, FieldType[k.T, V], Out],
                                                lk: LacksKey[L, k.T]): HListWrapper[Out] = {
    new HListWrapper(updater(hl, field[k.T](v)))
  }
}
object HListWrapper {
  def apply[P <: Product, L <: HList](p: P)(implicit gen: LabelledGeneric.Aux[P, L]) =
    new HListWrapper(gen.to(p))
}

它是这样用的:

代码语言:javascript
复制
case class CC(i: Int, ii: Int)
val cc = CC(100, 1000)
val hl = HListWrapper(cc)
hl.append('iii, 10000)

但是,当我试图将HListWrapper放入另一个函数以捕获Out类型时,编译器似乎无法解析转换的最终类型(类型错配错误失败):

代码语言:javascript
复制
def cctohlist[Out <: HList]: CC => HListWrapper[Out] = {
  m => {
    val hl = HListWrapper(m)
    hl.append('iii, 10000)
  }
}

创建cctohlist方法的主要原因是在追加后获取HList的类型。这是可能的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-02 08:57:23

以下代码起作用:

代码语言:javascript
复制
def cctohlist: CC => HListWrapper[Record.`'i -> Int, 'ii -> Int, 'iii -> Int`.T] = {
    m => {
      val hl = HListWrapper(m)
      hl.append('iii, 10000)
    }
  }

当你写

代码语言:javascript
复制
def cctohlist[Out <: HList]: CC => HListWrapper[Out] = ???

这意味着我可以应用cctohlist[Int :: String :: Boolean :: HNil]并拥有CC => HListWrapper[Int :: String :: Boolean :: HNil],或者我可以应用cctohlist[AnyVal :: AnyRef :: Any :: HNil]CC => HListWrapper[AnyVal :: AnyRef :: Any :: HNil]等等。

这是一种通用的方法:

代码语言:javascript
复制
def cctohlist[P <: Product, L <: HList, Out <: HList](m: P)(implicit
  gen: LabelledGeneric.Aux[P, L],
  updater: Updater.Aux[L, FieldType[Witness.`'iii`.T, Int], Out],
  lk: LacksKey[L, Witness.`'iii`.T]
  ): HListWrapper[Out] = {
    val hl = HListWrapper(m)
    hl.append('iii, 10000)
  }

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

https://stackoverflow.com/questions/47066012

复制
相关文章

相似问题

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