Scala 隐式参数中断类型推断或推断不足以解决其问题?

Scala 隐式参数中断类型推断或推断不足以解决其问题?,scala,type-inference,typeclass,implicits,Scala,Type Inference,Typeclass,Implicits,在我添加隐式排序证据之前,类型推断在本例中运行良好。类型推断规则(从左到右&跨参数列表)似乎得到了满足,但隐式的某些方面打破了它 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 expan

在我添加隐式排序证据之前,类型推断在本例中运行良好。类型推断规则(从左到右&跨参数列表)似乎得到了满足,但隐式的某些方面打破了它

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
类型是推断出来的,但是当隐式解析发生时,它认为它什么都没有,换句话说,它认为它好像我没有在
val result:Int
中指定
Int
。这是一个bug吗?

这里的问题是scala无法推断
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)
scala>val i=Insert(3)
:9:错误:类型排序的发散隐式展开[O]
从对象排序中的方法Tuple9开始
val i=插入(3)

发散隐式扩展
错误是scala试图找到适用于这种情况的隐式扩展并陷入循环。这是一条红鲱鱼。

Imho这里的重要时刻是发生在这里的类型构造
val result:Int=execute(Insert(“test”)
,之前的任何事情都只是一个类型参数声明,Imho
O
case类Insert[I,O](arg:I)(隐式证据:排序[O])
作为一个参数,这里只有类型构造很重要,并且在当时类型
Int
是否被推断,因为我明确指定了它,所以隐式参数应该被解析。我的观点是,
O
永远不会像您认为的那样被推断为
Int
O
被推断为
Nothing
,而您的方法最终的返回类型是
Nothing
。我明白您的意思,因此,如果类型推断从
val I:Int
转换为
execute
Insert
(我认为应该是这样的),那么它是否能跨方法调用工作就成了一个问题,对吗?又名“从左到右,跨参数列表”,问题是它是否也跨方法调用工作:-)我希望您明白我的观点,因为这个类定义编译精细的
case-class-Insert[I,O](arg:I)(隐式证据:Ordering[O])
,直到您尝试在这里实例化类型参数
val-result:Int=execute(插入(“测试”))
如果实际推断出
Int
类型,这里是有隐式参数和没有隐式参数的程序的类型检查内部的比较:没有隐式参数,未确定的类型变量
O
被推断为
Nothing
,以适应
execute的结果类型e> 对于声明的类型
Int
。使用隐式参数,对
Ord[O]
的隐式搜索无法解析唯一的匹配隐式,并且在考虑
Int
之前,类型检查失败。