1

この例では、暗黙的な順序付けの証拠を追加するまで、型推論は正常に機能します。型推論規則 (左から右へ & パラメーター リスト全体) は満たされているように見えますが、それを破る暗黙的なものがあります。

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"))

したがって、型推論は暗黙的な解決には不十分であるか、暗黙的な解決が型推論を破ります。

型は推測されていると思いますが、暗黙の解決が行われている場合、それは Nothing と見なされます。つまり、 で指定しOなかったかのように見なされます。バグですか?Intval result: Int

4

1 に答える 1

1

ここでの問題は、O型が存在しないため、scala が型を推測できないことです。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]) 

これにより、コンパイラは と推論するしかありませONothing。のインスタンスを作成する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 がこのdiverging implicit expansionケースで機能する暗黙的なものを見つけようとして、サイクルに巻き込まれていることです。アカニシンです。

于 2014-12-17T00:26:11.550 に答える