別の質問( [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
^
これを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]]
の暗黙のパラメーターを受け取り、S
はconv
によりOrdering[S]
であるため、同じ場所でOrdered[T]
の暗黙のパラメーターを検索します。そのため、ordering
を構築できません。
次に、math.Orderingでordering
を使用しようとしますが、これも適合しません。しかし、これがやや混乱を招く「暗黙の相違」メッセージを与えていると思います。問題は、それらが分岐していることではなく、スコープ内に適切なものが存在しないことですが、下がる2つのパスがあるという事実によって混乱しています。暗黙の順序付けされた関数なしでdef foo[T <% Ordered[T]](s : Seq[T]) = s.sorted
を定義しようとすると、適切な暗黙の関数が見つからないという素敵なメッセージだけで失敗します。