Что такое расходящаяся неявная ошибка расширения?
при попытке найти решение другого вопроса ([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
без неявной упорядоченной функции, то он терпит неудачу с просто хорошим сообщением о том, что он не может найти подходящий неявный.