簡體   English   中英

具有泛型類型參數的 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 允許您使用 Meta 實例插入任何類型(及其選項)的值,其中包括...

但在這種情況下似乎還不夠; 我需要什么是正確的類型類/導入/轉換?

差不多一年后,我將繼續回答我自己的問題。 我從來沒有完全理解發生了什么,而且我已經更新到了較新版本的 doobie,所以我不確定這有多相關。 但現在文檔包含了這個線索:

注意:理解 Meta 的存在只是為了將 Get/Put 對引入隱式作用域是很重要的。 您永遠不應該要求 Meta 作為用戶代碼中的證據:而是要求 Get、Put 或兩者兼而有之。

 def foo[A: Meta](...) // don't do this def foo[A: Get: Put](...) // ok

事實上,在那個變化和新版本之間,這對我來說現在編譯得很好:

class TableAccess[A: Get: Put](table: String) {

當編譯器解析隱式時,它會在當前范圍內搜索特定類型之一。 在這里,他似乎在樹搜索中找到了不止一個。

這不是缺少類型類或導入的問題,更像是它們太多而編譯器無法找出正確的。 嘗試刪除一些隱式並查看其工作原理或顯式傳遞它們。

我解決這個問題的一種方法是將類型參數(及其證據)本地化到方法(在靜態/伴隨對象上),然后編譯。

類似的東西

object MinimalGood {
  def good[A: Meta, B: Meta](a: A, b: B): Update0 =
  sql"""$a $b""".update
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM