12

私はせっかちな人のために Scala を読んでいて、頭を悩ませているものに出くわしました。

以下は文字列を返します。

scala> for ( c<-"Hello"; i <- 0 to 1) yield (c+i).toChar
res68: String = HIeflmlmop

しかし、これはベクトルを返します:

scala> for (i <- 0 to 1; c <- "Hello") yield (c + i).toChar
res72: scala.collection.immutable.IndexedSeq[Char] = Vector(H, e, l, l, o, I, f, m, m, p)

これら 2 つの例の前にあるテキストは...

「forループの本体がyieldで始まると、ループは反復ごとに1つずつ、値のコレクションを構築します...このタイプのループはfor内包表記と呼ばれます。生成されたコレクションは、最初のジェネレーターと互換性があります。

生成されたコレクションが最初のジェネレーターと互換性がある場合、次のように、2 番目の例が範囲の型を返さないのはなぜですか。

scala> val range = 0 to 1
range: scala.collection.immutable.Range.Inclusive = Range(0, 1)

それとも、「...生成されたコレクションは最初のジェネレーターと互換性があります」というテキストの意味を完全に誤解していますか。

4

2 に答える 2

6

for-comprehensions は、一連のmap, flatMapandfilter操作に脱糖されます。

で使用するmapと、出力Rangeが得られます。Vector

scala> 0 to 2 map (x => x * x)
res12: scala.collection.immutable.IndexedSeq[Int] = Vector(0, 1, 4)

これは、aRangeが非常に単純な種類のコレクションであるためです。つまり、基本的には、開始値、終了値、およびステップの 2 つの 3 つの数値だけです。上記のマッピングの結果を見ると、結果の値がRange型の何かで表現できないことがわかります。

于 2013-05-11T16:11:39.420 に答える