题
同时试图找到一个解决方案的另一个问题([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
参数通过,你会得到更多的信息:
卡拉.这一点。Prefed.符合不是一个有效的内隐价值(T)=>有序[T],因为:
类型的不匹配:
发现:<:<[T,T]
要求:(T)=>有序[T]
卡拉.这一点。predef.符合不是一个有效的隐含的价值为(序[T])=>有序[有序[T]],因为:
类型的不匹配:
发现:<:<[序[T],下令[T]]
要求:(下令[T])=>有序[有序[T]]
数学。这一点。订购。订购不是一个有效的内隐价值,为排序[T],因为:
类型参数的[T]不符合法令的类型参数范围[一个 <:卡拉.数学。下令[A]]
这主要是推测,但似乎使一些意义的。我将试图进一步调查:
这似乎表明,有三个隐式转换,目前正在考虑在这里。最终,该签名的 sorted
需要找到的东西的类型 Ordering[T]
.所以这是试图建造你的隐含的功能 ordering
.首先,它试图填补在 conv
通过找到一个隐含的类型 (T) => Ordered[T]
, ,在这里这是搜索Predef-这似乎是叫了错误的树。然后试图找到一个隐含的对 (Ordered[T]) => Ordered[Ordered[T]]
在同一个地方,由于 by
需要一个隐含的参数的类型 Ordering[S]
, ,哪里 S
是 Ordered[T]
凭借的 conv
.因此,它不能建造 ordering
.
然后,它试图使用 ordering
在数学。订购,但是这个还不合适的。然而,我认为这是什么给予有点混乱'散隐式转换'信息。问题不在于他们散,这是没有一个合适的一个范围,但它正在困惑的事实,即有两条路下去。如果一个人试图定义 def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted
没有隐含有序的功能,那么它的失败只是一个很好的消息说,它无法找到一个合适的隐性。