5

Scala コレクション API のセットとリストの間に一貫性がないのはなぜですか?

たとえば、不変の Set と可変の Set があります。後者を使用する場合は、次のように簡単に実行できます。

val set = Set[A]()
set += new A

ただし、変更可能な List 自体はありません。リストを使用して同様のコード スニペットを作成する場合、どのデータ構造を使用すればよいですか? LinkedList は変更可能ですが、 += メソッドが定義されていないため、良い候補のように思えます。ListBuffer は要件を満たしているようですが、リストではありません。

2.8 コレクションのドキュメントを読んだ後、MutableList がおそらく最適であるという結論に達しました。

scala.collection.mutable.List があればいいのにと思います。

4

5 に答える 5

20

この理由は、Java が関数 List型を採用して、関数型ではないもの (つまりjava.util.Listリストではない) を意味するようにしたためです。

そのような型は矛盾した表現であるため、関数型プログラミング言語がミュータブル を持つことはおそらく意味がありません。ListしたがってListBuffer、またはArrayBuffer。またはIndexedSeq、可変および不変の実装がある を使用するだけです

于 2010-11-03T22:56:43.847 に答える
9

SetScalaのコレクションライブラリのシーケンス/リストアナログはですSeqListは、のように、特定の不変の実装SeqですVectorArrayBufferまたははListBufferの典型的な実装ですmutable.Seq

于 2010-11-05T11:49:47.737 に答える
3

ArraySeq は、 += が非常に遅いことを除いて、探しているものかもしれません。java.util.ArrayList を使用して collection.JavaConversions._ をインポートすることもできます。

Scala には、一定の時間インデックス (Java の ArrayList など) を持つ可変のリストのような優れたコレクションが欠けているようです。

いずれにせよ、「List」は正確にタイプ「scala.immutable.List」を指すことに注意してください。したがって、Seq (またはその他のより抽象的なコレクション型) は、不変/可変コレクションを一般化する場合、"List" ではなくメソッドで期待する型です。

より理想的なのは、IndexedSeq を要求することです。これは、そのコレクションに対してインデックス操作が実行されることを意味します。ただし、 ListBuffer がそのカテゴリに該当するかどうかはわかりません。

于 2010-11-03T22:51:24.903 に答える
2

Setは単なる特性であるため、抽象的であり、実装が必要です。mutable.Setしたがって、またはであるクラスについて話すことができますimmutable.Set

一方、Listクラスであり、(抽象) trait の実装ですimmutable.LinearSeq。である他のクラスはあり得ませんList。ただし、特性があることがわかりますmutable.LinearSeq

Java 用語では、インターフェイスとクラスを比較しています。これらは別個のものです。

于 2010-11-04T23:47:16.293 に答える
0

忘れないでくださいscala.collection.mutable.{LinkedList,DoubleLinkedList}。それらは可変であり、LinearSeq. ミューテーションは少し奇妙です。参照に割り当てることで頭を変更し、elem参照に割り当てることで尾を変更できnextます。

たとえば、このループはすべての負の値をゼロに変更します。

val lst = collection.mutable.LinkedList(1, -2, 7, -9)
var cur = lst
while (cur != Nil) { 
  if (cur.elem < 0) cur.elem = 0
  cur = cur.next 
}

このループは、リストから 1 つおきの要素を削除します。

var cur = lst
while (cur != Nil && cur.next != Nil) { 
  cur.next = cur.next.next
  cur = cur.next 
}

これらが不変のリストよりも優れていると言っているわけではありません。Scala には、データ構造クラスで見たものとかなり似た可変リストがあることを指摘しているだけです。

于 2011-07-19T02:06:11.273 に答える