首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有泛型参数的Scala doobie片段

带有泛型参数的Scala doobie片段
EN

Stack Overflow用户
提问于 2018-02-17 02:47:12
回答 3查看 1.3K关注 0票数 12

我试图将不同类型的对象抽象到类似结构的sql表中。我想做的是:

代码语言:javascript
复制
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(_ => ())
  }
}

但是我得到了这个编译错误:

代码语言:javascript
复制
[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允许您使用Meta实例插值任意类型的值(及其选项),其中包括.

但在这种情况下,这似乎是不够的;我需要什么样的类型/导入/转换?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-01-06 19:10:29

差不多一年后,我会回答我自己的问题。我从来没有完全理解发生了什么,我已经更新到一个更新版本的多比,所以我不知道这有多重要。但是现在文档中包含了这样的线索:

注意:重要的是要理解Meta的存在只是为了将Get/Put对引入隐式范围。您不应该在用户代码中要求Meta作为证据:相反,应该要求Get、Put或两者兼备。 def A: Meta/不要这样做,A: Get: Put // ok

事实上,在这一变化和新版本之间,这对我来说是很好的:

代码语言:javascript
复制
class TableAccess[A: Get: Put](table: String) {
票数 3
EN

Stack Overflow用户

发布于 2018-03-18 08:42:52

当编译器解析隐式时,它将搜索当前作用域中的特定类型之一。在这里,他似乎发现了不止一个在他的树搜索。

这不是缺少类型或导入的问题,它更像是有太多的类型或导入,编译器无法找到正确的类型。尝试删除一些隐式,看看它是如何工作的,或者显式传递它们。

票数 0
EN

Stack Overflow用户

发布于 2018-10-09 19:16:36

我解决这个问题的一种方法是将类型参数(及其证据)本地化到方法上(在静态/同伴对象上),然后编译。

有点像

代码语言:javascript
复制
object MinimalGood {
  def good[A: Meta, B: Meta](a: A, b: B): Update0 =
  sql"""$a $b""".update
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48837393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档