2015-07-24 18 views
6
case object Empty extends Stream[Nothing] 
case class Cons[+A](h:() => A, t:() => Stream[A]) extends Stream[A] 

sealed trait Stream[+A] { 

    def toList: List[A] = { 
    val buf = new collection.mutable.ListBuffer[A] 
    def go(s: Stream[A]): List[A] = s match { 
     case Cons(h, t) => 
     buf += h() 
     go(t()) 
     case _ => buf.toList 
    } 
    go(this) 
    } 

    def cons[A](hd: => A, tl: => Stream[A]): Stream[A] = Stream.cons(hd, tl) 

    def empty = Stream.empty 

    def unfold[A, S](z: S)(f: S => Option[(A, S)]): Stream[A] = f(z) match { 
    case Some((h,t)) => cons(h, unfold(t)(f)) 
    case None => empty 
    } 

    def take(n: Int): Stream[A] = unfold((this, n)) { 
    case (Cons(h, t), 1) => Some((h(), (empty, 0))) 
    case (Cons(h, t), n) if n > 1 => Some((h(), (t(), n-1))) 
    case (Empty, 0) => None 
    } 
} 

object Stream { 

    def cons[A](hd: => A, tl: => Stream[A]): Stream[A] = Cons(() => hd,() => tl) 

    def empty[A]: Stream[A] = Empty 

    val ones: Stream[Int] = Stream.cons(1, ones) 
} 

object StreamTest { 
    def main(args: Array[String]) { 

    //why compile error: forward reference extends over definition of value ones 
    /*val ones: Stream[Int] = Stream.cons(1, ones) 
    println(ones.take(5).toList)*/ 

    println(Stream.ones.take(5).toList) 
    } 
} 

क्यों संकलन त्रुटि परिभाषा पर फैली ?: आगे संदर्भ मूल्य वालेस्केला आगे संदर्भ

जोड़ी वस्तु 'स्ट्रीम' में

की परिभाषा पर फैली, वैल वाले: स्ट्रीम [इंट] = Stream.scons (1, वाले) ठीक है

लेकिन मुख्य विधि में, यह ठीक नहीं है (लेकिन ... एक ही सिंथेटिक!)

+0

@mz कृपया मुख्य विधि में टिप्पणी चिह्न (/ * * /) हटाएं, '/ * वैल वाले: स्ट्रीम [Int] = Stream.cons (1, ones) println (ones.take (5) .toist) */' – Curycu

उत्तर

7

स्थानीय वैल सदस्य नहीं हैं।

object StreamTest extends App { 
    //def main(args: Array[String]) { 

    //why compile error: forward reference extends over definition of value ones 
    val ones: Stream[Int] = Stream.cons(1, ones) 
    println(ones.take(5).toList) 

    println(Stream.ones.take(5).toList) 
    //} 
} 

ब्लॉकों में प्रतिबंध in the spec here, जहां अन्य सलाह है शब्दों है यह ब्लॉक, जो एक ही प्रभाव पड़ता है में एक आलसी वैल बनाने के लिए:

अपने परीक्षण कोड के लिए, यह करते हैं।

+0

यह काम करता है! मुख्य विधि के बिना, StreamTest ऑब्जेक्ट चलता है ... शायद कारण है 'ऐप बढ़ाता है' मुझे लगता है। 'आलसी वाल' दृष्टिकोण भी अच्छी तरह से काम करता है। ब्लॉक में प्रतिबंध काफी दिलचस्प है। धन्यवाद! – Curycu

+0

'ऐप' प्रारंभकर्ता को 'मुख्य' से चलाता है लेकिन आप टेम्पलेट अर्थशास्त्र रखते हैं। –

1

आगे संदर्भ Cons[+A]... जो इस लाइन में संदर्भित है में है:

case object Empty extends Stream[Nothing] 
case class Cons[+A](h:() => A, t:() => Stream[A]) extends Stream[A] 

स्थानांतरित करने के लिए

def cons[A](hd: => A, tl: => Stream[A]): Stream[A] = Cons(() => hd,() => tl) 

कोशिश साथी वस्तु में।

+0

'ऑब्जेक्ट स्ट्रीम' में 'खाली, विपक्ष' को स्थानांतरित करें और संकलन त्रुटियों को दूर करने के लिए' Cons => Stream.Cons और खाली => Stream.Empty 'बदलें। लेकिन कुछ भी बदल नहीं – Curycu

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