在尝试找到另一个问题([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
^
Run Code Online (Sandbox Code Playgroud)
Sub*_*oid 21
如果您在scala中运行此-Xlog-implicits参数并传递参数,则可以获得更多信息:
scala.this.Prefed.conforms不是(T)=> Ordered [T]的有效隐含值,因为:
类型不匹配:
发现:<:<[T,T]
要求:(T)=>有序[T]
scala.this.predef.conforms不是(Ordered [T])=> Ordered [Ordered [T]]的有效隐含值,因为:
类型不匹配:
发现:<:<[订购[T],订购[T]]
要求:(有序[T])=>有序[有序[T]]
math.this.Ordering.ordered不是Ordering [T]的有效隐含值,因为:
类型参数[T]不符合方法有序的类型参数边界[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没有隐式有序函数的情况下进行定义,那么它会失败,只有一条好消息说它无法找到合适的隐式函数.
| 归档时间: |
|
| 查看次数: |
15132 次 |
| 最近记录: |