2013-05-11 14 views
10

私はScala for the Impatientを読んでいます。私は頭を傷つけている何かを見つけました。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つの値の集合を構築します。このタイプのlo opは、理解のために呼ばれます。生成されたコレクションは、最初のジェネレータと互換性があります。

生成されたコレクションは、なぜ、次のように、範囲の型を返す第二の例ではありません、最初の発電機との互換性がある場合:

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

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

+0

、それがどのように機能するかについて、より良いビューを取得するには、[この優れた解答](http://stackoverflow.com/a/1716558/406435)を見てみましょう。そして[ここに](http://www.devoxx。com/display/FR13/Martin + Odersky)(42:40から開始)Martin Odersky自身が、スカラコレクションの歴史、モチベーション、実装について説明しています。 – senia

答えて

4

については、map,およびfilterの操作に変更されています。

あなたはRangemapを使用する場合は、あなたがVector出力を得る:

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

Rangeは、コレクションの非常にシンプルなものです、それは基本的にちょうど 3つの数字であるので、これは次のとおりです。スタート値、終了値、およびステップ。上のマッピングの結果を見ると、結果の値をRangeタイプのもので表すことはできません。このfor (i <- 0 to 1; c <- "Hello") yield (c + i).toChar理解に

0

、 第1発電機はタイプであるscala.collection.immutable.Range.Inclusive 収量結果ベクトルは、タイプのscala.collection.immutable.IndexedSeq [INT] とIFであります http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.Range

それは範囲IndexedSeqをミックスイン/拡張を示しています。あなたは、クラス範囲をご確認ください。スーパータイプインデックス付きは、のサブタイプと互換性があります。

結果が範囲で表されない場合(前の回答の説明どおり)、スーパータイプを検索して結果を表します。

enter image description here