【问题标题】:API for Shapeless Extensible Records无形可扩展记录的 API
【发布时间】:2016-09-02 16:36:12
【问题描述】:

我正在尝试学习 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(不收紧到无形)以及如何收集信息以解决此类问题?

【问题讨论】:

  • 不确定它是否会起作用,但我认为您应该将更新器类型的隐式参数添加到upsert,就像您对upd 所做的那样。这是 shapeless 的一般经验法则:如果它要求隐式值,请尝试将其作为隐式参数添加到相关函数。

标签: scala shapeless


【解决方案1】:

我想,我会把我的评论作为答案,以便它可以被接受。

根据我使用 shapeless 的经验,当编译器抱怨缺少隐式值时,首先要做的是尝试通过隐式参数将其提供给相关函数,特别是如果所讨论的类型来自 shapeless。 Shapeless 提供了很多这些隐式,添加隐式参数很有可能会修复此类错误。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多