[英]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]
類型的隱式參數,其中S
是Ordered[T]
conv
所以它無法構建ordering
。
然后它嘗試在math.Ordering中使用ordering
,但這也不適合。 但是,我認為這就是給出了一些令人困惑的“不一致的暗示”信息。 問題不在於它們是分歧的,而是在范圍內沒有合適的問題,但是它有兩條路可走的事實讓人感到困惑。 如果一個人試圖在沒有隱式有序函數的情況下定義def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted
,那么它會失敗,只有一條好消息說它無法找到適合隱含。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.