API 对于无形可扩展记录
API for Shapeless Extensible Records
我正在尝试学习 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]]
能否请您帮助我了解如何构建这样的 APIs(未收紧到无形)以及如何收集信息来解决此类问题?
我想,我会把我的评论作为答案,这样它才能被接受。
根据我使用 shapeless 的经验,当编译器抱怨缺少隐式值时,首先要做的是尝试通过隐式参数将其提供给相关函数,尤其是当所讨论的类型来自 shapeless 时. Shapeless 提供了很多隐式参数,添加隐式参数很有可能会修复此类错误。
在这种情况下,将Updater
(不确定类型参数,但它们应该与upd
中的参数一致)隐式参数添加到upsert
函数。
我正在尝试学习 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]]
能否请您帮助我了解如何构建这样的 APIs(未收紧到无形)以及如何收集信息来解决此类问题?
我想,我会把我的评论作为答案,这样它才能被接受。
根据我使用 shapeless 的经验,当编译器抱怨缺少隐式值时,首先要做的是尝试通过隐式参数将其提供给相关函数,尤其是当所讨论的类型来自 shapeless 时. Shapeless 提供了很多隐式参数,添加隐式参数很有可能会修复此类错误。
在这种情况下,将Updater
(不确定类型参数,但它们应该与upd
中的参数一致)隐式参数添加到upsert
函数。