具有泛型类型参数的 Scala doobie 片段
Scala doobie fragment with generic type parameter
我正在尝试将不同类型的插入对象抽象到具有相似结构的 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(_ => ())
}
}
但是我得到这个编译错误:
[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(_ => ())
我能在文档中找到的是:
doobie allows you to interpolate values of any type (and options
thereof) with an Meta instance, which includes...
但在这种情况下似乎还不够; typeclass/imports/conversions 我需要什么?
当编译器解析隐式时,它会在当前范围内搜索特定类型之一。在这里,他似乎在他的树搜索中找到了不止一个。
这不是缺少类型类或导入的问题,更像是你有太多类型类或导入,编译器无法找到正确的。
尝试删除一些隐式的,看看它是如何工作的,或者显式地传递它们。
我解决这个问题的一种方法是将类型参数(及其证据)本地化到方法(在 static/companion 对象上),然后编译。
类似
object MinimalGood {
def good[A: Meta, B: Meta](a: A, b: B): Update0 =
sql"""$a $b""".update
}
差不多一年后,我将继续回答我自己的问题。我从来没有完全理解发生了什么,而且我已经更新到更新版本的 doobie,所以我不确定这有多相关。但是现在文档包含了这个线索:
Note: it is important to understand that Meta exists only to introduce
Get/Put pairs into implicit scope. You should never demand Meta as
evidence in user code: instead demand Get, Put, or both.
def foo[A: Meta](...) // don't do this
def foo[A: Get: Put](...) // ok
事实上,在那个变化和新版本之间,现在编译对我来说很好:
class TableAccess[A: Get: Put](table: String) {
我正在尝试将不同类型的插入对象抽象到具有相似结构的 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(_ => ())
}
}
但是我得到这个编译错误:
[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(_ => ())
我能在文档中找到的是:
doobie allows you to interpolate values of any type (and options thereof) with an Meta instance, which includes...
但在这种情况下似乎还不够; typeclass/imports/conversions 我需要什么?
当编译器解析隐式时,它会在当前范围内搜索特定类型之一。在这里,他似乎在他的树搜索中找到了不止一个。
这不是缺少类型类或导入的问题,更像是你有太多类型类或导入,编译器无法找到正确的。 尝试删除一些隐式的,看看它是如何工作的,或者显式地传递它们。
我解决这个问题的一种方法是将类型参数(及其证据)本地化到方法(在 static/companion 对象上),然后编译。
类似
object MinimalGood {
def good[A: Meta, B: Meta](a: A, b: B): Update0 =
sql"""$a $b""".update
}
差不多一年后,我将继续回答我自己的问题。我从来没有完全理解发生了什么,而且我已经更新到更新版本的 doobie,所以我不确定这有多相关。但是现在文档包含了这个线索:
Note: it is important to understand that Meta exists only to introduce Get/Put pairs into implicit scope. You should never demand Meta as evidence in user code: instead demand Get, Put, or both.
def foo[A: Meta](...) // don't do this def foo[A: Get: Put](...) // ok
事实上,在那个变化和新版本之间,现在编译对我来说很好:
class TableAccess[A: Get: Put](table: String) {