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