Что такое расходящаяся ошибка неявного раскрытия?
Вопрос
При попытке найти решение другого вопроса ( [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
в math.Ordering, но это тоже не подходит. Однако я думаю, что это то, что дает несколько сбивающее с толку сообщение о «расходящихся имплицитах». Проблема не в том, что они расходятся, а в том, что нет подходящего по охвату, а сбивает с толку тот факт, что есть два пути, по которым можно спуститься. Если кто-то пытается определить ordering
без неявной упорядоченной функции, он терпит неудачу с простым сообщением о том, что не может найти подходящий неявный.