web-dev-qa-db-ja.com

発散する暗黙の拡張エラーとは何ですか?

別の質問( [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
                                                ^
44
IttayD

これを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]型の何かを見つけることを要求します。つまり、暗黙の関数orderingを構築しようとしています。最初に、タイプ(T) => Ordered[T]のインプリシットを見つけてconvに入力しようとします。ここでは、Predefで検索しています-これは間違ったツリーを起動したようです。 byはタイプ(Ordered[T]) => Ordered[Ordered[T]]の暗黙のパラメーターを受け取り、SconvによりOrdering[S]であるため、同じ場所でOrdered[T]の暗黙のパラメーターを検索します。そのため、orderingを構築できません。

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

21
Submonoid