Неявные параметры нарушают вывод типа или вывода не хватает для их разрешения?

Вывод типа работает нормально в этом примере, пока я не добавлю неявное доказательство упорядочения. Правила вывода типов (слева направо и через списки параметров), похоже, удовлетворены, но есть что-то в отношении неявного, которое нарушает его.

case class Insert[I, O : Ordering](arg: I)
def execute[I,O](req: Insert[I,O]): O = null.asInstanceOf[O]
val result: Int = execute(Insert("test"))

Error:(5, 39) diverging implicit expansion for type Ordering[O]
starting with method Tuple9 in object Ordering
lazy val result: Int = execute(Insert("test"));}
                                     ^

Это компилируется и работает нормально:

case class Insert[I, O](arg: I)
def execute[I,O](req: Insert[I,O]): O = null.asInstanceOf[O]
val result: Int = execute(Insert("test"))

Таким образом, либо вывод типа недостаточно для неявного разрешения, либо неявное разрешение нарушает вывод типа.

Я думаю, O Тип выводится, но когда происходит неявное разрешение, он видит его как Ничто, другими словами, он видит его так, как будто я не указал Int в val result: Int, Это ошибка?

1 ответ

Решение

Проблема здесь в том, что скала не может вывести O типа, потому что его нет в Insert

// I is in the parameter list but there is no O to be found
case class Insert[I, O](arg: I)(implicit evidence: Ordering[O]) 

Это не оставляет компилятору другого выбора, кроме как сделать вывод O быть Nothing, Создание экземпляра Insert будет не в состоянии скомпилировать.

scala> val i = Insert(3)
<console>:9: error: diverging implicit expansion for type Ordering[O]
starting with method Tuple9 in object Ordering
   val i = Insert(3)

diverging implicit expansion ошибка - это попытка scala найти неявное, подходящее для этого случая, и попасть в цикл. Это красная сельдь.

Другие вопросы по тегам