2010-06-02 15 views
7

मैं खुद के संदर्भ में एक धारा परिभाषित कर रहा हूं (एक पुनरावर्ती परिभाषा)। स्ट्रीम के दूसरे तत्व तक पहुंचने का प्रयास करते समय, StackOverflowError फेंक दिया जाता है। स्कैला कंसोल से कोड:रिकर्सिव स्ट्रीम फेंकता है StackOverflowError

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... 

मैं स्टैक ओवरफ़्लो के कारण को समझने में असमर्थ हूं। चूंकि धाराएं स्वाभाविक रूप से आलसी हैं, रिकर्सिव मैपिंग काम करनी चाहिए।

इस परिदृश्य में क्या गलत है?

मैं स्कैला संस्करण 2.8.0.आरसी 2 का उपयोग कर रहा हूं।

उत्तर

8

समस्या यह है कि 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 
+1

यह http://lampsvn.epfl.ch/trac/scala/ticket/2634 है –

संबंधित मुद्दे