1

私は無限のストリームを持っており、当然のことながら、そこから何らかの要素まで「プル」する必要があります。これが最初のステップです。ただし、「プルされた」要素の一部のみが 2 番目のステップで使用されます。たとえば、偶数要素のみが使用されます。遅延によって奇数要素の処理を回避することは可能ですか?

私が求めていることを説明するより良い方法は、コードを示すことです:

  Welcome to Scala version 2.9.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_26).
  Type in expressions to have them evaluated.
  Type :help for more information.

  scala> var n=0; def numbers:Stream[Int] = {n += 1; println("n= " + n); n #:: numbers}
  n: Int = 0
  numbers: Stream[Int]

  scala> numbers.map{z => println("z^2= " + z*z) ; z*z}.take(10)(2)
  n= 1
  z^2= 1
  n= 2
  z^2= 4
  n= 3
  z^2= 9
  res0: Int = 9

  scala> var n=0; def numbers:Stream[Int] = {n += 1; println("n= " + n); n #:: numbers}
  n: Int = 0
  numbers: Stream[Int]

  scala> numbers.map{lazy z => println("z^2= " + z*z) ; z}.take(10)(2)
  <console>:1: error: lazy not allowed here. Only vals can be lazy
  numbers.map{lazy z => println("z^2= " + z*z) ; z*z}.take(10)(2)
  ^

  scala> 

の結果は であるため、take(10)(2)実際に必要なのは計算res0: Int = 9だけです。z^2= 9

4

1 に答える 1

2

z^2(map操作)の計算を延期したい場合は、次のようにviewすれば十分です。

object Worksheet {
  var n = 0                                   //> n  : Int = 0
  def numbers: Stream[Int] = { n += 1; println("n= " + n); n #:: numbers }
                                              //> numbers: => Stream[Int]

  numbers.view.map { z => println("z^2= " + z * z); z }.take(10)(2)
                                              //> n= 1
                                              //| n= 2
                                              //| n= 3
                                              //| z^2= 9
                                              //| res0: Int = 3
}

必要になるまでストリーム内の数値の生成を遅らせたい場合は、手動で行うことができます。

object sheet {
  var n = 0                                   //> n  : Int = 0
  def numbers: Stream[() => Int] = (() => { n += 1; println("n= " + n); n }) #:: numbers
                                              //> numbers: => Stream[() => Int]

  numbers.view.map { z => val x = z(); println("z^2= " + x * x); x }.take(10)(2)
                                              //> n= 1
                                              //| z^2= 1
                                              //| res0: Int = 1
}

ここでの問題は、Scala ライブラリーのストリームが頭の中で遅延していないことのようです。Scalaz ライブラリにすでにそのようなものがあったとしても、私は驚かないでしょう。

于 2013-01-22T06:38:49.550 に答える