2011-03-11 12 views
6

यहाँ मैं क्या सोचा स्केला में फिबोनैकी nums की सही और उपयोगी परिभाषा होगा:Scalas (क, ख) .zipped (या Tuple2.zipped) धाराओं धारणा का उपयोग कर/अनंत सूचियों

lazy val fibs:Stream[Int] = 0 #:: 1 #:: (fibs,fibs.tail).zipped.map(_+_) 

हालांकि, मुझे निम्न त्रुटि मिलती है:

fibs take 10 foreach println 
0 
1 
java.lang.StackOverflowError 
    at scala.collection.mutable.LazyBuilder.(LazyBuilder.scala:25) 
    at scala.collection.immutable.Stream$StreamBuilder.(Stream.scala:492) 
    at scala.collection.immutable.Stream$.newBuilder(Stream.scala:483) 
    at... 

मुझे लगता है कि ज़िपित धाराओं के साथ सही ढंग से काम नहीं करता है? इस काम को कैसे बनाया जाए, या यह क्यों नहीं (चाहिए नहीं?) काम करने के बारे में कोई सुझाव?

+0

मैं बस इस _exact_ प्रश्न पूछने जा रहा था। किसी को पता है कि मेरे सामने यहाँ आ गया है। +1 – KChaloux

उत्तर

8

निम्न कार्य सही ढंग से

val fibs:Stream[Int] = 0 #:: 1 #:: (fibs zip fibs.tail).map{ case (a,b) => a+b } 

Tuple2.zipped के साथ समस्या यह मान लिया गया है कि यह दृश्यों यह ज़िप करने है पर foreach चला सकते है। यह शायद डिज़ाइन द्वारा किया गया है, जैसे कि Stream.zip लागू करने के तरीके से यह संभवतः आपको किसी भी सीमित लंबाई Seq के लिए खराब प्रदर्शन देगा जो List या Stream नहीं है। (क्योंकि सबसे डेटा संरचनाओं tail का एक कुशल कार्यान्वयन का समर्थन नहीं करते।)


Stream.zip अनिवार्य रूप से इस प्रकार है (हालांकि यह प्रकार अधिक सामान्य बनाने के लिए कुछ सामान करता है) लागू किया गया है।

class Stream[A]{ 
    def zip(other:Stream[B]) = 
    (this.head, other.head) #:: (this.tail zip other.tail) 
} 
+0

हालांकि आपके प्रश्न में 'आलसी' क्वालीफायर अनावश्यक था, लेकिन मैं आपको आश्वासन देता हूं कि इसे मेरे उत्तर में हटाकर यह काम नहीं किया गया था। –

+0

ठीक है, जो आपने दिखाया है वह बहुत अच्छा है :) मुझे लगता है कि यह केवल यह दिखाने के लिए चला जाता है कि हमें "ज़िपविथ" की कितनी आवश्यकता है जो 2-एरीटी फ़ंक्शन को हैकेल जैसे तर्क के रूप में लेता है। मुझे वास्तव में नहीं मिलता है कि यह स्कैला में क्यों नहीं है? – Felix

+1

@ फ़ेलिक्स: मुझे नहीं लगता कि 'zipWith' कैसे मदद करेगा। एक tuple पर 'zipWith' अभी भी' foreach 'के रूप में लागू किया जाएगा जो पहली सूची एक अनंत धारा थी जब बहती है। –

3

वहाँ स्काला के Trac डेटाबेस में इस पर एक टिकट दिया गया है: http://lampsvn.epfl.ch/trac/scala/ticket/2634

टिकट wontfix के रूप में बंद कर दिया गया था, लेकिन Adriaan के ध्यान दें "या फिर हम कुछ याद कर रहे हैं?" टिप्पणियों में - शायद यह किसी दिन फिर से मिल जाएगा।

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