4

Scala で 2 つのセットのカーディナリティを比較したかったのです。Scalaでは時々「そのまま動く」ので<、セット間で使ってみました。うまくいったように見えますが、結果から意味がわかりません。

例:

scala> Set(1,2,3) < Set(1,4)
res20: Boolean = true
  • それは何を返しますか?
  • API のこのメソッドについてどこで読むことができますか?
  • の下にリストされていないのはなぜscala.collection.immutable.Setですか?

更新: セット内の要素の順序(??) も重要なようです:

scala> Set(2,3,1) < Set(1,3)
res24: Boolean = false

scala> Set(1,2,3) < Set(1,3)
res25: Boolean = true
4

3 に答える 3

5

これは 2.8 では機能しません。Scala 2.7 では、次のようになります。

scala.Predef.iterable2ordered(Set(1, 2, 3): Iterable[Int]) < (Set(1, 3, 2): Iterable[Int])

言い換えれば、 on に定義された暗黙の変換がありscala.Predef、これはすべての Scala コードで an から an に「インポート」Iterable[A]されます (暗黙の変換Ordered[Iterable[A]]A => Ordered[A]利用できる場合)。

セットの iterable の順序が定義されていないことを考えると、実際にはあまり予測できません。たとえば、要素を追加してセット サイズを 4 より大きくすると、まったく異なる結果が得られます。

于 2010-07-01T21:42:04.910 に答える
2

カーディナリティを比較したい場合は、直接行ってください:

scala> Set(1, 2, 3).size < Set(2, 3, 4, 5).size
res0: Boolean = true
于 2010-07-01T19:41:18.653 に答える
0

私の Scala に関する知識はそれほど多くありませんが、いくつかのテストを行ったところ、次の結果が得られました。

scala> Set(1,2) <
<console>:5: error: missing arguments for method < in trait Ordered;
follow this method with `_' if you want to treat it as a partially applied function
   Set(1,2) <
            ^

それは<trait に由来することを教えてくれますOrdered。その他のヒント:

scala> Set(1,2) < _
res4: (Iterable[Int]) => Boolean = <function>

つまり、 Iterable[A] から Ordered[Iterable[A]] への暗黙的な変換があるため、Setは に評価されますがIterable、もうわかりません... テストは一貫していません。たとえば、次の 2 つは一種の辞書式比較を示唆している可能性があります。

scala> Set(1,2,3) < Set(1,2,4)
res5: Boolean = true

1 は等しい、2 は等しい、3 は 4 より小さい。

scala> Set(1,2,4) < Set(1,2,3)
res6: Boolean = false

しかし、これらはしません:

scala> Set(2,1) < Set(2,4)
res11: Boolean = true

scala> Set(2,1) < Set(2,2)
res12: Boolean = false

正しい答えは、Ordered固有の特性にあると思います: <hashCode を比較する以上のセット間の実装はありません:

Ordered[A] のインスタンスの hashCode メソッドが比較メソッドと一致していることが重要です。ただし、賢明なデフォルトの実装を提供することはできません。したがって、Ordered[A] のインスタンスのハッシュを計算できるようにする必要がある場合は、継承時またはインスタンス化時に自分で提供する必要があります。

于 2010-07-01T20:04:36.850 に答える