2011-12-15 48 views
5

Chạy:Scala Suối nhầm lẫn

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

tôi mong đợi:

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

Và tôi nhận được:

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

Ông có thể giải thích cho tôi?

+2

Tại sao bạn mong đợi 'x.head' trả về một danh sách? – sepp2k

+0

Điều làm tôi bối rối là lý do tại sao trên trái đất bạn muốn đặt một 'println' bên trong định nghĩa của một val lười biếng. –

+2

@Dan: Để tìm hiểu khi nào và tần suất biểu thức sẽ thực thi (và những giá trị khác nhau sẽ như thế nào), tôi hình dung. – sepp2k

Trả lời

5

Lý do bạn nhận được số Int thay vì Lists là luồng số nguyên, do đó, nó chứa số nguyên chứ không phải danh sách.

Lý do bạn nhận được 3 là đuôi (1,2,3,4,5, ...) (tức là s) là (2,3,4,5, ...) và nếu bạn lập bản đồ +1 trên đó, bạn sẽ nhận được (3,4,5,6,7, ...) và người đứng đầu đó là 3.

Lý do tại sao chỉ có một số nguyên được in là biểu thức là chỉ được đánh giá một lần để có được luồng cho đuôi. Sau đó chỉ có luồng được trả về bởi s.tail.map(_+1) được đánh giá (không chứa bất kỳ câu lệnh in nào).

+0

xem xét điều này: 'val s: Luồng [Int] = 1 # :: 2 # :: {val x = s.tail.map (1+); x lấy 10 bản in; x} 'sẽ in' 3333 ... 'và té ngã, vì vậy' x' có vẻ là một Luồng ba, chứ không phải 3,4,5, ... nhưng nó không có ý nghĩa bởi vì sau đó 's' phải là một' Luồng (1,2,3,3,3, ...) '. Tôi rất bối rối, bất kỳ lời khuyên nào, nơi tôi có thể đọc thêm về luồng? – 4e6

+0

@ 4e6: Tiêu thụ nhiều phần tử của luồng hơn so với đã được tạo ra bên trong biểu thức tạo luồng, sẽ gây ra đệ quy vô hạn (cuối cùng sẽ làm nổ tung ngăn xếp). Lý do bạn nhận được quá nhiều 3s không phải là luồng chứa nhiều 3s (nếu chúng được phân tách bằng dấu phẩy), nhưng câu lệnh in được thực hiện rất nhiều lần (vì logic lặp lại trong vòng tròn và được câu lệnh in lặp đi lặp lại ...). – sepp2k

+0

@ 4e6 Hãy xem xét những gì bạn đã viết: để tính số thứ ba, nó cần in 10 số đầu tiên. Nhưng làm thế nào nó có thể in số thứ ba nếu nó chưa tính toán? Đó là bạn bạn nhận được một lỗi. –