3

scala 2.7.5 で不変オブジェクトを処理する必要があり、そのメンバーの 1 つは不変の Sortedsetです。私は加算に問題はありません。合成するために、次のようになります。

class MyClass[A](s:SortedSet[A]) {
  ...
  def  + (elem:A):MyClass[A] {
    new MyClass(s + elem)
  }
}

+ 演算子は、SortedSet を返す特性 sortedSet でオーバーロードされているため、機能します。

残念ながら、メソッドがオーバーロードされていないため、要素の削除は失敗します。

class MyClass[A](s:SortedSet[A]) {
  ...
  def  - (elem:A):MyClass[A] {
    new MyClass(s - elem) // Compiler error: (s - elem) is a Set[A]
  }
}

次のことを知っている要素を抑制するときに、ソートされたセットを取得する方法を知っている人はいますか? - TreeSet のようなより具体的な種類のセットを使用したくありません。- SortedSet の代わりに Set[A] として特定性の低い特性を使用することはできません。

4

3 に答える 3

3

2.8まで待っていただければ、これでちゃんと動きそうです。

SortedSetLike.scalaから(不変トレイトのスーパーSortedSetトレイト)

trait SortedSetLike[A, +This <: SortedSet[A] with SortedSetLike[A, This]] extends Sorted[A, This] with SetLike[A, This]

これにより、This型が a になりSortedSetます。次に、SetLike.scalaでは、-オペレーターの署名は次のとおりです。

def - (elem: A): This

SortedSetしたがって、 aで使用するとa が正しく返されSortedSetます。

于 2009-08-13T11:46:46.630 に答える
1

想像に反して、結果-を保証するものではありません。SortedSetスモール セットは、さまざまなクラスを通じて最適化されます。Set-は抽象的であるため、実装方法がわからず、SortedSetソートされていないセットを返す方法で a を自由に実装できます。

以下は非効率的ですが、機能します。それを使用するか、そのまま使用するか、asInstanceOf2.8 を待つことができます。:-)

class MyClass[A](s: SortedSet[A]) {
  def -(elem: A)(implicit view: A => Ordered[A]): MyClass[A] = {
    new MyClass(TreeSet(s.toList - elem: _*))
  }
}
于 2009-08-13T17:12:05.963 に答える