21

Scalaにリストの暗黙的な順序付けがない理由はありますか?

val lists = List(List(2, 3, 1), List(2, 1, 3))
lists.sorted

error: could not find implicit value for parameter ord: Ordering[List[Int]]

編集

はい、私の質問は、スコープ内にすでに暗黙的に含まれている組み込みの順序付けがない理由です。私には、0の項目は等しく、2番目のリストの項目は1であるため、2番目のリストは最初のリストより「少ない」はずです。リストは2つの異なるサイズです。

4

7 に答える 7

45

見落としだと思います。辞書式順序付けは、Seqs では意味があります。標準ライブラリに追加する必要があります。

于 2010-12-20T21:24:28.093 に答える
8

ちなみに、これを修正する前でも、他の方法でこれを行うことができました:

scala> List[Iterable[Int]](List(2, 3, 1), List(2, 1, 3)).sorted
res0: List[Iterable[Int]] = List(List(2, 1, 3), List(2, 3, 1))

scala> List(List(2, 3, 1), List(2, 1, 3)).sorted(Ordering[Iterable[Int]])
res1: List[List[Int]] = List(List(2, 1, 3), List(2, 3, 1))

しかし、今では期待どおりに機能します。

編集:必要な暗黙的な大ざっぱな発散の問題のため、デフォルトのスコープから移動しました。次のように、境界を越えて動作する暗黙の変換があります。

implicit def SeqDerived[CC[X] <: collection.Seq[X], T](implicit ord: Ordering[T]): Ordering[CC[T]]

...問題の潜在的なレシピです。2.9 で利用可能になりますが、次のようにインポートする必要があります。

scala> val lists = List(List(2, 3, 1), List(2, 1, 3))
lists: List[List[Int]] = List(List(2, 3, 1), List(2, 1, 3))

scala> lists.sorted
<console>:9: error: could not find implicit value for parameter ord: Ordering[List[Int]]
       lists.sorted
             ^

scala> import Ordering.Implicits._
import Ordering.Implicits._

scala> lists.sorted
res1: List[List[Int]] = List(List(2, 1, 3), List(2, 3, 1))
于 2010-12-21T07:21:40.247 に答える
4

あなたが持っているのはリストのリストであり、整数のリストではありません。不足しているのは、リストが<=別のリストであるかどうかを判断するための基準です。

これがエラーメッセージの内容です。リストを別のリストと比較する方法が見つかりません。明示的に指定する必要があります。

あなたの質問が「なぜリストに他のリストとの比較方法が組み込まれていないのか」だったとしたら、それはまさにその通りです。

于 2010-12-20T19:44:25.783 に答える
4

List[Int] のクラスに対する唯一の本当に適切な合計順序は、辞書式です (つまり、リストの最初の要素を比較し、それらが等しい場合は 2 番目の要素を比較し、2 番目が等しい場合は 3 番目の要素を比較します)。これは標準ライブラリでは提供されていません。おそらく、実際に必要とされるケースがそれほど多くないためです。それを実装する List[X] から Ordering[List[X]] への暗黙的な変換を作成するのは簡単で、必要な場所にその変換をインポートするだけです。

于 2010-12-20T20:08:13.280 に答える
1

sortWith を使用できます。zip は違いを捨てるので、これは異なるサイズのリストを考慮していませんが、あなたが求めているようなことをすると思います:

lists.sortWith((a,b) => {
  a.zip(b).filterNot(x => x._1 == x._2) match {
    case Nil => true
    case t => t._1 < t._2
  }
})
于 2010-12-20T20:59:10.683 に答える