簡體   English   中英

什么是分歧的隱式擴展錯誤?

[英]What is a diverging implicit expansion error?

在嘗試找到另一個問題( [1] )的解決方案時,我遇到了一個不同的隱式擴展錯誤。 我正在尋找關於這意味着什么的解釋

這是用例:

scala> implicit def ordering[T](implicit conv: T => Ordered[T], res: Ordering[Ordered[T]]) = Ordering.by(conv)
ordering: [T](implicit conv: (T) => Ordered[T],implicit res: Ordering[Ordered[T]])scala.math.Ordering[T]

scala> def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted
<console>:6: error: diverging implicit expansion for type Ordering[T]
starting with method ordering in object $iw
       def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted
                                                ^

如果在scala中運行此命令並傳遞了-Xlog-implicits參數,則可以獲得更多信息:

scala.this.Prefed.conforms不是(T)=> Ordered [T]的有效隱含值,因為:

類型不匹配:

發現:<:<[T,T]

要求:(T)=>有序[T]

scala.this.predef.conforms不是(Ordered [T])=> Ordered [Ordered [T]]的有效隱含值,因為:

類型不匹配:

發現:<:<[訂購[T],訂購[T]]

要求:(有序[T])=>有序[有序[T]]

math.this.Ordering.ordered不是Ordering [T]的有效隱含值,因為:

類型參數[T]不符合方法有序的類型參數邊界[A <:scala.math.Ordered [A]]

這主要是猜測,但似乎有道理。 我會嘗試進一步調查:

這似乎表明這里有三個含義。 最終, sorted的簽名要求它找到Ordering[T]類型的東西。 所以它試圖構造你的隱式函數ordering 首先,它試圖通過找到類型(T) => Ordered[T]的隱式來填充conv ,它在Predef中進行搜索 - 這似乎是在咆哮錯誤的樹。 然后它試圖在同一個地方找到一個隱含的(Ordered[T]) => Ordered[Ordered[T]] ,因為by采用Ordering[S]類型的隱式參數,其中SOrdered[T] conv 所以它無法構建ordering

然后它嘗試在math.Ordering中使用ordering ,但這也不適合。 但是,我認為這就是給出了一些令人困惑的“不一致的暗示”信息。 問題不在於它們是分歧的,而是在范圍內沒有合適的問題,但是它有兩條路可走的事實讓人感到困惑。 如果一個人試圖在沒有隱式有序函數的情況下定義def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted ,那么它會失敗,只有一條好消息說它無法找到適合隱含。

暫無
暫無

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

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