【问题标题】:Scala Streams: Self-Reference, Function Calls and Lazy EvaluationScala Streams:自引用、函数调用和惰性求值
【发布时间】:2012-04-25 13:18:01
【问题描述】:

我试图了解为什么以下使用 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 进行操作,而不会在流是自引用的时破坏惰性求值。

【问题讨论】:

    标签: scala stream lazy-evaluation


    【解决方案1】:

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

    【讨论】:

    • 谢谢,但是: def main(args: Array[String]): Unit = { lazy val shift = ( sns : SimNumericStream ) => new SimNumericStream( 0 #:: sns.scalstream ) lazy val y : SimNumericStream = shift(y) y.scalstream.take(10).print } 也会产生相同的(运行时)错误,而函数的(手动)内联则不会。
    • @George 在那个 sn-p 中你刚刚将问题转移到一个函数中:如果你已经有一个实例,你仍然只能创建一个新实例。可以自我引用,但自我复制的对象必须有其他东西才能创建第一个对象。
    • 我想我很难理解为什么这个问题在有效的版本中也不存在。在这种情况下,我们在同一个 SimNumericStream (y) 的定义中也有“新 SimNumericStream”。自我复制不是我要找的,只是自我参考。也许以另一种方式问这个问题,您将如何定义一个返回移位流的“移位”函数,然后在被移位的流的定义中使用该函数?还有其他方法吗?
    • @George 我想我不明白你认为你说的解决方案有什么问题,你说的很好;据我所知,它并没有破坏惰性评估。我只是想解释一下为什么失败的版本会这样做,因为它没有通过基本的完整性检查。
    • 就我而言,它的问题是调用代码需要查看 SimNumericStream 对象内部:我应该能够在 SimNumericStream 对象本身上实现移位运算符,隐藏在后台使用 Scala 流实现。我错了,还是一种形式有效而另一种形式没有破坏参照透明度的想法?
    【解决方案2】:

    我通过以下方式达到了我想要的效果:

      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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      相关资源
      最近更新 更多