Что такое расходящаяся неявная ошибка расширения?

при попытке найти решение другого вопроса ([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
                                                ^

1 ответов


если вы запустите это в Scala с -Xlog-implicits аргумент передан, вы получаете больше информации:

scala.этот.Prefed.conforms не является допустимым неявным значением для (T) = > Ordered[T], потому что:

несоответствие типа:

найдено:<:>

требуется: (T) = > заказано[T]

scala.этот.предопределенных.conforms не является допустимым неявным значением для (Ordered[T]) = > Ordered[Ordered[T]], потому что:

несоответствие типа:

найдено:<:>

требуется : (Ordered[T]) => Ordered[Ordered[T]]

математика.этот.Заказ.ordered не является допустимым неявным значением для Ordering[T], потому что:

аргументы типа [T] не соответствуют границам параметров типа метода ordered [A <:>

это в основном спекуляции, но, похоже, имеет смысл. Я постараюсь исследуйте дальше:

это, кажется, предполагает, что здесь рассматриваются три импликации. В конечном счете, подпись sorted требует, чтобы он нашел что-то типа Ordering[T]. Таким образом, он пытается построить вашу неявную функцию ordering. Во-первых, он пытается заполнить conv найти неявного типа (T) => Ordered[T], где он ищет в Predef-что похоже на лай на неправильное дерево. Затем он пытается найти неявное for (Ordered[T]) => Ordered[Ordered[T]] в то же место, с by принимает неявный параметр типа Ordering[S], где S is Ordered[T] в силу conv. Поэтому он не может построить ordering.

затем он пытается использовать ordering в математике.Заказ, но это тоже не подходит. Тем не менее, я думаю, что это то, что дает несколько запутанное сообщение "расходящиеся имплициты". Проблема не в том, что они расходятся, а в том, что нет подходящего по масштабу, но его смущает тот факт, что есть два пути вниз. Если попытаться определить def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted без неявной упорядоченной функции, то он терпит неудачу с просто хорошим сообщением о том, что он не может найти подходящий неявный.