48

別の質問 ( [1] )の解決策を見つけようとしているときに、発散する暗黙の展開エラーに遭遇しました。これが何を意味するかについての説明を探しています

ユースケースは次のとおりです。

scala> implicit def ordering[T](implicit conv: T => Ordered[T], res: Ordering[Ordered[T]]) = Ordering.by(conv)
ordering: [T](implicit conv: (T) => Ordered[T],implicit res: Ordering[Ordered[T]])scala.math.Ordering[T]

scala> def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted
<console>:6: error: diverging implicit expansion for type Ordering[T]
starting with method ordering in object $iw
       def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted
                                                ^
4

1 に答える 1

23

引数を渡してこれを scala で実行すると、-Xlog-implicitsより多くの情報が得られます。

scala.this.Prefed.conforms は (T) => Ordered[T] の有効な暗黙の値ではありません。

型の不一致:

見つかった: <:<[T,T]

必須: (T) => 注文済み[T]

scala.this.predef.conforms は (Ordered[T]) => Ordered[Ordered[T]] の有効な暗黙の値ではありません。

型の不一致:

見つかった : <:<[Ordered[T], Ordered[T]]

必須: (Ordered[T]) => Ordered[Ordered[T]]

math.this.Ordering.ordered は Ordering[T] の有効な暗黙の値ではありません。

型引数 [T] は、順序付けられたメソッドの型パラメーターの境界に準拠していません [A <: scala.math.Ordered[A]]

これはほとんど憶測ですが、ある程度の意味があるようです。私はさらに調査しようとします:

これは、ここで考慮されている 3 つの暗黙の要素があることを示唆しているようです。最終的に、 の署名でsortedは、タイプの何かを見つける必要がありますOrdering[T]。したがって、暗黙の関数を構築しようとしていますorderingconvまず、暗黙の type を見つけて入力しようとし(T) => Ordered[T]ています。ここで Predef を検索しています。これは、間違ったツリーを吠えているように見えます。(Ordered[T]) => Ordered[Ordered[T]]次に、同じ場所で暗黙的な for を見つけようとしています。これbyは、 type の暗黙的なパラメーターを受け取るためです。Ordering[S]ここで、SOrdered[T]のおかげですconv。したがって、構築できませんordering

その後ordering、math.Ordering で使用しようとしますが、これも適合しません。ただし、これがやや紛らわしい「発散する暗黙の」メッセージを与えていると思います。問題は、それらが分岐していることではなく、スコープ内に適切なものがないことですが、2 つのパスがあるという事実によって混乱しています。暗黙的な順序付き関数なしで定義しようとするとdef foo[T <% Ordered[T]](s : Seq[T]) = s.sorted、適切な暗黙的な関数が見つからないという素敵なメッセージだけで失敗します。

于 2011-02-03T11:47:17.093 に答える