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