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