22

forScalaでaを評価すると、不変IndexedSeq(効率的なランダムアクセスなどの配列のようなパフォーマンス特性を持つコレクション)が得られます。

scala> val s = for (i <- 0 to 9) yield math.random + i
s: scala.collection.immutable.IndexedSeq[Double] = Vector(0.6127056766832756, 1.7137598183155291, ...

forwithはyield常にを返しますかIndexedSeq、それとも他のタイプのコレクションクラス(LinearSeqたとえば、a)を返すこともできますか?それが他のものも返すことができる場合、何が戻りタイプを決定し、どのようにそれに影響を与えることができますか?

Scala2.8.0.RC3を使用しています。

4

2 に答える 2

19

コメントをありがとうmichael.kebe。

これは、、、、およびを使用した操作にfor変換される方法を説明しています。だから私の例:mapflatMapfilterforeach

val s = for (i <- 0 to 9) yield math.random + i

map次のようなものに翻訳されています(に翻訳されているのか、この場合は翻訳されているのかわかりませんflatMap):

val s = (0 to 9) map { math.random + _ }

コレクションのような操作の結果のタイプはmap、それを呼び出すコレクションによって異なります。のタイプ0 to 9Range.Inclusive

scala> val d = 0 to 9
d: scala.collection.immutable.Range.Inclusive with scala.collection.immutable.Range.ByOne = Range(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

mapその操作の結果はIndexedSeq(コレクションライブラリ内のビルダーのもののため)です。

だから、私の質問に答えるために:aの結果はfor (...) yield ...、parantheses内にあるタイプによって異なります。結果としてが必要な場合は、次のListようにすることができます。

scala> val s = for (i <- List.range(0, 9)) yield math.random + i
s: List[Double] = List(0.05778968639862214, 1.6758775042995566, ...
于 2010-06-01T08:17:06.013 に答える
6

toListを使用して、いつでも範囲をリストに変換できます。

> val s = for (i <- (0 to 9).toList) yield math.random + i
> s  : List[Double]
于 2013-04-29T22:57:12.873 に答える