Scala Streams:自引用,函数调用和惰性求值

时间:2012-04-25 13:18:01

标签: scala stream lazy-evaluation

我试图理解为什么以下使用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内部包含操作,而不会在流自引用时破坏延迟评估。

2 个答案:

答案 0 :(得分:3)

在你的第一个版本中,你实例化SimNumericStream的调用是在SimNumericStream的一个实例中,所以除非你已经有一个实例,否则你永远不会真正实例化它。

答案 1 :(得分: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