在尝试寻找另一个问题( [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 is not a valid implicit value for (T) => Ordered[T] because:
type mismatch:
found : <:<[T,T]
required: (T) => Ordered[T]
scala.this.predef.conforms is not a valid implicit value for (Ordered[T]) => Ordered[Ordered[T]] because:
type mismatch:
found : <:<[Ordered[T], Ordered[T]]
required : (Ordered[T]) => Ordered[Ordered[T]]
math.this.Ordering.ordered is not a valid implicit value for Ordering[T] because:
type arguments [T] do not conform to method ordered's type parameter bounds [A <: scala.math.Ordered[A]]
这主要是猜测,但似乎有一定道理。我将尝试进一步调查:
这似乎表明这里正在考虑三个隐式含义。最终签名为sorted
要求它找到 Ordering[T]
类型的内容。所以它试图构造你的隐式函数 ordering
。首先,它尝试填写 conv
通过查找 (T) => Ordered[T]
类型的隐式,它在 Predef 中搜索 - 这看起来像是找错了树。然后它试图找到 (Ordered[T]) => Ordered[Ordered[T]]
的隐式。在同一个地方,从by
开始采用 Ordering[S]
类型的隐式参数,其中S
是 Ordered[T]
凭借conv
。所以它无法构造ordering
.
然后它尝试使用 ordering
在 math.Ordering 中,但这也不适合。然而,我认为这就是给出有点令人困惑的“分歧隐含”信息的原因。问题不在于它们存在分歧,而在于范围内没有合适的路径,而是因为有两条路可走,这一事实令人困惑。如果尝试定义 def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted
如果没有隐式有序函数,那么它就会失败,并只显示一条很好的消息,表明它找不到合适的隐式函数。
关于scala - 什么是发散隐式展开误差?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4883906/