1

誰かが REPL からの次の出力について説明してもらえますか?

mapの前. (ピリオド) を 1 つの定義に、_ _ (スペース) をもう 1 つの定義に使用します。

これによりmapのバインドが異なることがわかりますが、2 番目の定義からの出力の1はどうなるでしょうか?

ありがとう。

scala> lazy val infinite: Stream[Int] = 1 #:: infinite.map(_+1)
infinite: Stream[Int] = <lazy>

scala> val l = infinite.take(10).toList.mkString(",")
l: String = 1,2,3,4,5,6,7,8,9,10

scala> lazy val infinite2: Stream[Int] = 1 #:: infinite2 map(_+1)
infinite2: Stream[Int] = <lazy>

scala> val l2 = infinite2.take(10).toList.mkString(",")
l2: String = 2,3,4,5,6,7,8,9,10,11
4

2 に答える 2

11

メソッドの結合性についてです。これ:

1 #:: infinite.map(_+1)

これは非常に簡単です:

1 #:: infinite2 map(_+1)

コンパイラによって次のように解釈されます。

(1 #:: infinite2) map(_+1)

1 #:: infinite2は目的のストリームですが、それを返す前に、すべての項目に 1 を追加する遅延変換を適用します。これは、 が結果として表示されない理由を説明しています。1変換後は になり2ます。

詳細については、「 Scala での演算子の優先順位」を参照してください。は特殊文字ではないため#、 と同等に扱われmap、メソッドは左から右に評価されます。

于 2012-12-05T18:31:34.720 に答える
1

infinite2の場合、表現した内容は次のようになります。

lazy val infinite2: Stream[Int] = (1 #:: infinite2) map(_ + 1)

ストリームは1で始まるため、マップは最初の要素に1を追加します。

于 2012-12-05T18:39:17.880 に答える