2011-12-15 11 views
5

Koşu:Scala Akış karışıklık

> List(2, 3) 
> List(2, 3, 4) 
List(1, 2, 3, 4, 5) 

Ve olsun:

lazy val s: Stream[Int] = 1 #:: 2 #:: {val x = s.tail.map(_+1); println("> " + x.head); x} 
s.take(5).toList 

Ben beklediğiniz

> 3 
List(1, 2, 3, 4, 5) 

sen bana açıklayabilir misiniz?

+2

Neden x.head'in bir liste döndürmesini bekliyorsunuz? – sepp2k

+0

Beni şaşırtan şey, neden dünya üzerinde tembel bir val tanımının içine bir 'println' koymak istediğiniz. –

+2

@Dan: İfadenin ne zaman ve ne sıklıkla uygulanacağını (ve ne zaman yapılacağını çeşitli değerler) öğrenmek için hayal ediyorum. – sepp2k

cevap

5

Biryerine Int aldığınız nedeni, s tamsayıların bir akışıdır, bu nedenle tamsayılar değil, listeler içerir.

3 almanızın sebebi (1,2,3,4,5, ...) (yani s) kuyruğunun (2,3,4,5, ...) olması ve Bunun üzerine +1 ile eşleşirsiniz (3,4,5,6,7, ...) ve bunun başı 3.

Sadece bir tamsayı yazdırmanın nedeni, ifadenin Sadece kuyruk için akış almak için bir kez değerlendirdi. Bundan sonra sadece s.tail.map(_+1) tarafından döndürülen akış değerlendirilir (herhangi bir baskı ifadesi içermez).

+0

bunu dikkate alır: 'val s: Akış [Int] = 1 # :: 2 # :: {val x = s.tail.map (1+); x 10 baskı al; x} '' 3333'ü yazdıracaktır ve düşer, yani 'x' 3'lük bir akımdır, 3,4,5 değil ... ama bir anlamı yok çünkü o zaman' '' olmalıdır. Akış (1,2,3,3,3, ...) '. Akımlar hakkında daha fazla şey okuyabileceğim herhangi bir tavsiye var mı? – 4e6

+0

@ 4e6: Akışı üreten ifadenin içinde henüz oluşturulmuş bir akışın daha fazla elemanının tüketilmesi, sonsuz yineleme (sonuç olarak yığının uçurulmasıyla sonuçlanacaktır) neden olacaktır. Bu kadar çok 3 elde etmenizin nedeni, akımın 3'leri içermesidir (eğer virgülle ayrılacaklarsa), ancak baskı ifadesi çok kez yürütülür (çünkü mantık daire içine girer ve baskı ifadesi tekrar tekrar ve tekrar ...). – sepp2k

+0

@ 4e6 Ne yazdığınızı düşünün: üçüncü sayıyı hesaplamak için, ilk 10 sayıyı yazdırmak gerekir. Ancak, henüz hesaplanmamışsa üçüncü sayıyı nasıl yazdırabilir? Sende bir hata var. –