2009-08-13 10 views
3

scala 2.7.5で不変オブジェクトを処理し、メンバの1つがimmutable Sortedsetです。 スカラ不変SortedSetは削除時に "安定"ではありません

class MyClass[A](s:SortedSet[A]) { 
    ... 
    def + (elem:A):MyClass[A] { 
    new MyClass(s + elem) 
    } 
} 
をそして+演算子がにSortedSetを返すために、形質たSortedSetで過負荷であるので、それは、動作します: 私はsynthetiseするほかに問題がきていない、それができます。

ので、残念ながら要素を削除すると失敗する - methosがオーバーロードされていません。

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]としてあまり特殊性の低いものは使用できません。

+0

私はSortedMap APIをチェックしていますが、正しくソートマップを返します( " - " SortedMapを返します)。説明、ボーナスの質問がありますか? – Nicolas

+0

Scala 2.7.xのコレクションライブラリはアドホックです。それはそれがあるようになるまで、時間とともに成長し、使用します。このような矛盾を解消することは、Scala 2.8の新しいコレクションライブラリの1つの目標です。 –

答えて

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タイプSortedSetになります。その後SetLike.scalaで、-オペレータの署名が

def - (elem: A): This 

あるのでSortedSetに使用されたときに正しくSortedSetを返します。

+0

はい、物事は2.8より優れています。しかし残念ながら、私は2.7.5の回避策が必要です。とにかくありがとう。 – Nicolas

+0

おそらくそのように思われましたが、とにかく役に立つと思っていました –

0

私はあなたがする必要があるのはそれをキャストすることだと思います。 " - "はSetを返しますが、SortedSetです。それはかなりではないかもしれないが、それは動作します:1が考えるかもしれないものに

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

    def -(elem:A): MyClass[A] = { 
     new MyClass((s - elem).asInstanceOf[SortedSet[A]]) 
    } 

    override def toString = "sorted set = " + s 
    } 

    val a = new MyClass(new TreeSet[Int]) 
    println(a) // prints "sorted set = Set()" 
    val b = a + 1 
    println(b) // prints "sorted set = Set(1)" 
    val c = a - 1 
    println(c) // prints "sorted set = Set()" 
+0

ほとんどのSortedSetは " - "の後にSortedSetを返さなければなりません。しかし、私はその解決策に伴うClassCastExceptionの危険性が気に入らない。 – Nicolas

1

反して、-SortedSet結果を保証するものではありません。小さなセットは、異なるクラスによって最適化されます。 Setの-は抽象であるため、実装方法はわからず、SortedSetはソートされていないセットを返すように実装することができます。

以下は非効率的ですが、機能します。あなたはそれを使用したり、asInstanceOfと一緒に生きたり、2.8を待つことができます。 :-)

class MyClass[A](s: SortedSet[A]) { 
    def -(elem: A)(implicit view: A => Ordered[A]): MyClass[A] = { 
    new MyClass(TreeSet(s.toList - elem: _*)) 
    } 
} 
+0

なぜ暗黙のうちにクラスの代わりにメソッドを配置しましたか?私がうまく理解していれば、暗黙的なパラメータは呼び出しから別のものに変わる可能性があり、それは厄介なように見えます。 はい:キャストエラーが発生する危険性があります。待機するか、非効率的な方法を使用することが唯一の選択肢のようです。私はそれと一緒に生きていなければならないと思う。 – Nicolas

+0

このメソッドの暗黙的な理由は特にありません。私はちょうどあなたがそれを書いたときに 'MyClass'宣言を保存しようとしていました。 –