【问题标题】:Recursive stream throws StackOverflowError递归流抛出 StackOverflowError
【发布时间】:2010-06-02 18:47:24
【问题描述】:

我正在根据自身定义一个流(递归定义)。当试图访问流的第二个元素时,StackOverflowError 被抛出。来自 Scala 控制台的代码:

scala> val s1 = Stream.iterate(1)(identity _)
s1: scala.collection.immutable.Stream[Int] = Stream(1, ?)

scala> lazy val s2 : Stream[Int]= Stream.cons(1, (s2, s1).zipped.map { _ + _ })
s2: Stream[Int] = <lazy>

scala> s1 take 5 print
1, 1, 1, 1, 1, empty
scala> s2(0)
res4: Int = 1

scala> s2(1)
java.lang.StackOverflowError
        at $anonfun$s2$1$$anonfun$apply$1.apply(<console>:9)
        at $anonfun$s2$1$$anonfun$apply$1.apply(<console>:9)
        at scala.Tuple2$Zipped$$anonfun$map$1.apply(Tuple2.scala:62)
        at scala.collection.immutable.Stream.foreach(Stream.scala:255)
        at scala.Tuple2$Zipped.map(Tuple2.scala:60)
        at $anonfun$s2$1.apply(<console>:9)
        at $anonfun$s2$1.apply(<console>:9)
        at scala.collection.immutable.Stream$Cons.tail(Stream.scala:556)
        at scala.collection.immutable.Stream$Cons.tail(Stream.scala:550)
        at scala.collection.immutable.Stream.foreach(Stream.scala:256)
        at scala.Tuple2$Zipped.map(Tuple2.scala:60)
        at $anonfun$s2$1.apply(<console>:9)
        at $anonfun$s2$1.apply(<console>:9)
        at scala.collection.immutable.Stream$Cons.tail(Stream.scala:556)
        at scala.collection.immutable.Str...

我无法理解堆栈溢出的原因。由于流本质上是惰性的,因此递归映射应该可以工作。

这种情况有什么问题?

我使用的是 Scala 版本 2.8.0.RC2。

【问题讨论】:

    标签: scala recursion stream scala-2.8 lazy-evaluation


    【解决方案1】:

    问题在于zipped 并不懒惰——它实际上试图在此处评估该地图。你可以用zip做你想做的事。

    scala> val s1 = Stream.iterate(1)(identity _)
    s1: scala.collection.immutable.Stream[Int] = Stream(1, ?)
    
    scala> lazy val s2: Stream[Int] = Stream.cons(1, (s2 zip s1).map {s=>s._1+s._2})
    s2: Stream[Int] = <lazy>
    
    scala> s2 take 5 print
    1, 2, 3, 4, 5, empty
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-03
      • 2012-10-21
      • 1970-01-01
      • 2015-10-28
      • 2012-04-29
      • 1970-01-01
      • 2016-08-23
      • 2021-03-22
      相关资源
      最近更新 更多