1

我试图理解为什么以下使用 Scala Streams 的代码不起作用:

def main(args: Array[String]): Unit = {
  lazy val y : SimNumericStream = y.shift
  y.scalstream.take(10).print
}

class SimNumericStream( ss : Stream[Double] )  {  
  lazy val scalstream = ss
  lazy val shift = new SimNumericStream( 0 #:: scalstream )
}

并替换

lazy val y : SimNumericStream = y.shift 

经过

lazy val y : SimNumericStream = new SimNumericStream( 0 #:: y.scalstream )

工作得很好。

我正在寻找一种解决方案,当流是自引用的时,它允许我在函数内部封装 Streams 上的操作,而不会破坏惰性求值。

4

2 回答 2

4

在您的第一个版本中,您对实例化的调用SimNumericStream在 的实例中SimNumericStream,因此除非您已经拥有一个,否则您永远无法实际实例化一个。

于 2012-04-25T13:26:31.253 回答
0

我通过以下实现了我想要的效果:

  class SimNumericStream(str: =>Stream[Double]) {
    def ::(hd: Double) = Stream.cons(hd, str)
    def shift = 0.0 :: this
  }
  implicit def streamToSimNumericStream(str: =>Stream[Double]) = new SimNumericStream(str)

  lazy val y: Stream[Double] = y.shift
于 2012-04-27T09:08:31.993 回答