繁体   English   中英

什么是分歧的隐式扩展错误?

[英]What is a diverging implicit expansion error?

在尝试找到另一个问题( [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不是(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 首先,它试图通过找到类型(T) => Ordered[T]的隐式来填充conv ,它在Predef中进行搜索 - 这似乎是在咆哮错误的树。 然后它试图在同一个地方找到一个隐含的(Ordered[T]) => Ordered[Ordered[T]] ,因为by采用Ordering[S]类型的隐式参数,其中SOrdered[T] conv 所以它无法构建ordering

然后它尝试在math.Ordering中使用ordering ,但这也不适合。 但是,我认为这就是给出了一些令人困惑的“不一致的暗示”信息。 问题不在于它们是分歧的,而是在范围内没有合适的问题,但是它有两条路可走的事实让人感到困惑。 如果一个人试图在没有隐式有序函数的情况下定义def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted ,那么它会失败,只有一条好消息说它无法找到适合隐含。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM