Scala doobie片段与泛型类型参数

Joe*_*e K 10 sql scala doobie

我试图抽象插入不同类型的对象到类似结构的SQL表.这是我正在尝试做的事情:

class TableAccess[A : Meta](table: String) {
  def insert(key: String, a: A): ConnectionIO[Unit] = {
    (fr"insert into " ++ Fragment.const(table) ++ fr" values ($key, $a);").update.run.map(_ => ())
  }
}
Run Code Online (Sandbox Code Playgroud)

但我得到这个编译错误:

[error] diverging implicit expansion for type doobie.util.param.Param[A]
[error] starting with method fromMeta in object Param
[error]     (fr"insert into " ++ Fragment.const(table) ++ fr" values ($key, $a);").update.run.map(_ => ())
Run Code Online (Sandbox Code Playgroud)

我在文档中找到的只有:

doobie允许您使用Meta实例插入任何类型的值(及其选项),其中包括...

但在这种情况下似乎还不够; 我需要什么样的类型类/进口/转换?

Joe*_*e K 3

差不多一年后,我将继续回答我自己的问题。我从来没有完全理解发生了什么,而且我已经更新到了新版本的 doobie,所以我不确定这有多么相关。但现在文档包含了这条线索:

注意:重要的是要理解 Meta 的存在只是为了将 Get/Put 对引入隐式作用域。您永远不应该要求 Meta 作为用户代码中的证据:而是要求 Get、Put 或两者兼而有之。

def foo[A: Meta](...)     // don't do this
def foo[A: Get: Put](...) // ok
Run Code Online (Sandbox Code Playgroud)

事实上,在这一更改和新版本之间,现在对我来说编译得很好:

class TableAccess[A: Get: Put](table: String) {
Run Code Online (Sandbox Code Playgroud)