2013-05-06 12 views
5

Bu yüzden, bu ihtiyaca göre çağrının sadece ad-by-adının hafızaya alınmış bir versiyonu olduğunu anlıyorum. Martin Odersky'nin Coursera'daki FP Kursunda, ders 7.3'te (Lazy Evaluation), Akımlar isim-ismi kullanılarak uygulandığında, potansiyel olarak hesaplama karmaşıklığında bir patlamaya yol açabileceğinden bahseder.Scala Stream çağrı-by-need (lazy) vs ad-by-isim

Böyle bir yanıltmaya bir örnek ne olurdu?

Çağrı isme göre:

def cons[T](hd: T, tl: => Stream[T]) = new Stream[T] { 
    def head = hd 
    def tail = tl 
    ... 
} 

Çağrı-by-muhtaç:

def cons[T](hd: T, tl: => Stream[T]) = new Stream[T] { 
    def head = hd 
    lazy val tail = tl 
    ... 
} 

cevap

2

Örneğin halefi oluşturmak üzere önceki iki öğe ekleyerek uygulamaya Fibonacci serisi. sayesinde -

scala> lazy val fib: Stream[Int] = Stream.cons(0, 
    | Stream.cons(1, fib.zip(fib.tail).map(p => p._1 + p._2))) 
fib: Stream[Int] = Stream(0, ?) 

Örnek lazily (sic) bir bağlantı kontrol edin this blog

+0

kopyalanmış – sailor

+0

@sailor: memoization olmadan, bu dizinin uzunluğu bir doğrusal yavaşlama (ve yığın büyümesi) olurdu , düzeltildi –