无形可扩展记录的API

时间:2016-09-02 06:30:24

标签: scala shapeless

我正在努力学习无形(2.3.2)。我为可扩展记录创建了一个非常简单的容器:

   case class Records[L <: HList](ps: L) {

  def get(k: Witness)(implicit selector: Selector[L, k.T]): selector.Out = selector(ps)

  def rm[V, Out <: HList](k: Witness)(implicit remover: Remover.Aux[L, k.T, (V, Out)]) =
    this.copy(ps = remover(ps)._2)

  def upd[F](f: F)(implicit updater: Updater[L, F]) = this.copy(ps = updater(ps, f))
}

现在我正在尝试实现API方法,如:

def upsert[T](k: String, v: T) = ???

我的所有尝试都完成了编译错误,如:

could not find implicit value for parameter updater: shapeless.ops.record.Updater[L,T with shapeless.labelled.KeyTag[k.type,T]]

您能否帮助我了解如何构建此类API(不会变得无形)以及如何收集信息以解决此类问题?

1 个答案:

答案 0 :(得分:2)

我想,我将我的评论作为答案,以便可以接受。

根据我使用无形的经验,当编译器抱怨缺少隐式值时,首先要做的是尝试通过隐式参数将其提供给相关函数,特别是如果有问题的类型是无形的。 Shapeless提供了大量的implicits,并且很有可能添加隐式参数来修复这样的错误。

在这种情况下,将Updater(不确定类型参数,但它们应与upd的那些参数一致)添加到upsert函数。