Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 递归流抛出堆栈溢出错误_Scala_Recursion_Stream_Scala 2.8_Lazy Evaluation - Fatal编程技术网

Scala 递归流抛出堆栈溢出错误

Scala 递归流抛出堆栈溢出错误,scala,recursion,stream,scala-2.8,lazy-evaluation,Scala,Recursion,Stream,Scala 2.8,Lazy Evaluation,我用流本身(递归定义)来定义流。尝试访问流的第二个元素时,会抛出StackOverflowerError。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 { _

我用流本身(递归定义)来定义流。尝试访问流的第二个元素时,会抛出
StackOverflowerError
。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>val s1=Stream.iterate(1)(标识)
s1:scala.collection.immutable.Stream[Int]=流(1,?)
scala>lazy val s2:Stream[Int]=Stream.cons(1,(s2,s1).zipped.map{{uu+})
s2:流[Int]=
scala>s1拍摄5张照片
1,1,1,1,1,空的
scala>s2(0)
res4:Int=1
scala>s2(1)
栈溢出
在$anonfun$s2$1$$anonfun$apply$1.apply(:9)
在$anonfun$s2$1$$anonfun$apply$1.apply(:9)
在scala.Tuple2$Zipped$$anonfun$map$1.apply处(Tuple2.scala:62)
位于scala.collection.immutable.Stream.foreach(Stream.scala:255)
位于scala.Tuple2$Zipped.map(Tuple2.scala:60)
在$anonfun$s2$1。应用(:9)
在$anonfun$s2$1。应用(:9)
位于scala.collection.immutable.Stream$Cons.tail(Stream.scala:556)
位于scala.collection.immutable.Stream$Cons.tail(Stream.scala:550)
位于scala.collection.immutable.Stream.foreach(Stream.scala:256)
位于scala.Tuple2$Zipped.map(Tuple2.scala:60)
在$anonfun$s2$1。应用(:9)
在$anonfun$s2$1。应用(:9)
位于scala.collection.immutable.Stream$Cons.tail(Stream.scala:556)
在scala.collection.immutable.Str。。。
我无法理解堆栈溢出的原因。由于流本身就是惰性的,递归映射应该可以工作

这种情况有什么不对


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

问题在于
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
scala>val s1=Stream.iterate(1)(标识)
s1:scala.collection.immutable.Stream[Int]=流(1,?)
scala>lazy val s2:Stream[Int]=Stream.cons(1,(s2-zip-s1.map{s=>s.\u1+s.\u2})
s2:流[Int]=
scala>s2进行5次打印
1,2,3,4,5,空的