scala - 什么是发散隐式展开误差?

标签 scala implicits

在尝试寻找另一个问题( [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] 类型的隐式参数,其中SOrdered[T]凭借conv 。所以它无法构造ordering .

然后它尝试使用 ordering在 math.Ordering 中,但这也不适合。然而,我认为这就是给出有点令人困惑的“分歧隐含”信息的原因。问题不在于它们存在分歧,而在于范围内没有合适的路径,而是因为有两条路可走,这一事实令人困惑。如果尝试定义 def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted如果没有隐式有序函数,那么它就会失败,并只显示一条很好的消息,表明它找不到合适的隐式函数。

关于scala - 什么是发散隐式展开误差?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4883906/

相关文章:

java - 将 scala 与 java 集成

java - 如何在 Scala 中向现有 Java 类添加工厂方法

scala - 如何能够在 Scala 中以递归方式应用隐式转换

scala - 隐式编译器错误?

scala - 无法在 Scala 中使用 Apache Commons CLI Option.builder()

Scala - 应用于隐式参数选择的 Co/Contra-Variance

Scala 命名和默认参数以及隐式参数

scala - 当类B扩展A和L <:A时,为什么List [B]不是Seq [L]的子类型?

sql - H2内存数据库使用UUID为主键时出现错误 "Data conversion error converting"

scala - 如何在 Apache Spark scala 中读取 PDF 文件和 xml 文件?