同时试图找到一个解决方案的另一个问题([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], ,哪里 SOrdered[T] 凭借的 conv.因此,它不能建造 ordering.

然后,它试图使用 ordering 在数学。订购,但是这个还不合适的。然而,我认为这是什么给予有点混乱'散隐式转换'信息。问题不在于他们散,这是没有一个合适的一个范围,但它正在困惑的事实,即有两条路下去。如果一个人试图定义 def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted 没有隐含有序的功能,那么它的失败只是一个很好的消息说,它无法找到一个合适的隐性。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top