什么是分歧隐含的扩展错误?

当试图find解决另一个问题( [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 ^ 

如果你通过-Xlog-implicits参数在scala中运行,你会得到更多的信息:

对于(T)=> Ordered [T],scala.this.Prefed.conforms不是有效的隐式值,因为:

types不匹配:

发现:<:<[T,T]

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

对于(Ordered [T])=> Ordered [Ordered [T]],scala.this.predef.conforms不是有效的隐式值,因为:

types不匹配:

发现:<:<[Ordered [T],Ordered [T]]

required:(Ordered [T])=> Ordered [Ordered [T]]

math.this.Ordering.ordered不是一个有效的Ordering [T]隐式值,因为:

types参数[T]不符合方法有序的types参数边界[A <:scala.math.Ordered [A]]

这主要是猜测,但似乎是有道理的。 我会试着进一步调查:

这似乎表明,这里正在考虑三个暗示。 最终, sorted的签名要求它findOrdering[T]types的东西。 所以它试图构build你的隐式函数ordering 。 首先,它试图通过findtypes(T) => Ordered[T]的隐式来填充conv ,它在Predef中进行search – 这看起来像是在错误的树上咆哮。 然后试图在同一个地方find一个隐式的(Ordered[T]) => Ordered[Ordered[T]] ,因为by一个隐式参数Ordering[S]SOrdered[T]conv 所以它不能构造ordering

然后它试图在math中使用ordering 。订购,但这也不适合。 不过,我认为这是给人一种混淆的“分歧暗示”信息。 问题不是它们在分歧,而是在范围上没有合适的范围,但是有两条路要走下去,这使我们感到困惑。 如果试图在没有隐式有序函数的情况下定义def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted ,那么它会失败,只是一个很好的消息,说它找不到合适的隐含。