0

私は Scala のストリームで遊んでいますが、そのアイデアを理解できるかどうかわかりません。次のコードを考えてみましょう

def fun(s: Stream[Int]): Stream[Int] = Stream.cons(s.head, fun(s.tail))

これを実行する

val f = fun(Stream.from(7))
f take 14 foreach println

との結果

7 8 9 10 ... up to 20

私はこれを理解しているとしましょう。

ここで、コードを少し変更します (head に 2 を追加)

def fun(s: Stream[Int]): Stream[Int] = Stream.cons(s.head + 2, fun(s.tail))

結果は

9 10 11 ... up to 22

改めて、わかったと思います。問題は次の例から始まります (d

def fun(s: Stream[Int]): Stream[Int] = Stream.cons(s.head / 2, fun(s.tail))

3 4 4 5 5 6 6 7 7 8 8 9 9 10

これはわかりません。なぜこのような結果になるのか説明してください。同様に、減算も期待どおりに動作しません

def fun(s: Stream[Int]): Stream[Int] = Stream.cons(s.head - 2, fun(s.tail))

出力

5 6 7 8 9 10 ... up to 18
4

3 に答える 3

1

あなたの「テイク」を考えると:7 8 9 10 ... up to 20

  • + 2各要素を使用するとどうなりますか?

  • / 2各要素 (int算術)を使用するとどうなりますか?

  • - 2各要素を使用するとどうなりますか?

于 2013-07-25T21:16:41.517 に答える
0

よし、分解してみる…

def fun(s: Stream[Int]): Stream[Int] = Stream.cons(s.head, fun(s.tail))

は、 をとり、そのとStreamを分離し、に再帰的に適用し、2 つの結果を演算子で再結合する関数です。headtailtailcons

headこの操作中は に触れないため、はStream以前のように要素ごとに再構築されます。

val f = fun(Stream.from(7))

fStream.from(7)[つまり、7 から始まる増加する整数の無限シーケンス]と同じです。

f take 14実際、印刷すると、7 から始まる最初の 14 個の数字[つまり、7,8,9,...,20]があることがわかります。

次に起こることは、ストリームを で再構築している間にcons、各要素が何らかの方法で変更されることです

def fun(s: Stream[Int]): Stream[Int] = Stream.cons(s.head + 2, fun(s.tail))

これにより、変更された と再結合する前に に2 が追加されます。後者は同じ方法で変更され、その最初の要素が 2 に追加され、それから独自の に再結合されます。headtailtail

再び 7 以降の数字が含まれていると仮定するとs、次のようになります。

fun(s) = cons(7 + 2, cons(8 + 2, cons(9 + 2, ... ad infinitum ... )))))

これは、ストリームのすべての要素に 2 を加算することと同じですs

このコードは、「9 から 22」を出力することでそれを確認します。これは、すべての要素に 2 を加えた正確な「7 から 20」です。

他の例も同様です。

  • 各要素が 2 で除算されたストリーム(および値でStream型指定されるため、下限の整数値に丸められIntます)
  • 各要素が2 減分されるストリーム
于 2013-07-25T22:23:04.107 に答える
0

をマッピングすると考えると、より直感的ですStreamか?

scala> val s1 = Stream.from(10)
s1: scala.collection.immutable.Stream[Int] = Stream(10, ?)

scala> val s2 = s1 map (_ * 2)
s2: scala.collection.immutable.Stream[Int] = Stream(20, ?)

scala> s2.take(5).toList
res0: List[Int] = List(20, 22, 24, 26, 28)

scala> val s3 = s1 map (_ / 2)
s3: scala.collection.immutable.Stream[Int] = Stream(5, ?)

scala> s3.take(5).toList
res1: List[Int] = List(5, 5, 6, 6, 7)

scala> val s4 = s1 map (_ - 2)
s4: scala.collection.immutable.Stream[Int] = Stream(8, ?)

scala> s4.take(5).toList
res2: List[Int] = List(8, 9, 10, 11, 12)
于 2013-07-25T21:44:20.233 に答える