/ / Dziwne zachowanie `Stream.take` - scala, stream

Dziwne zachowanie `Stream.take` - scala, stream

Próbuję kilku metod scala.Streami zdefiniował taką metodę:

def my(n: Int) = {
scala.Stream.from(1).flatMap { i =>
println("### " + i)
scala.Stream.from(i).takeWhile(_ < 10).map(j => (i, j))
}.take(n).filter(x => x._1 < 3 && x._2 < 5).toList
}

Jeśli dam n numer 45:

println(my(45))

Który kończy się bardzo szybko i drukuje:

### 1
### 2
### 3
### 4
### 5
### 6
### 7
### 8
### 9
List((1,1), (1,2), (1,3), (1,4), (2,2), (2,3), (2,4))

Ale jeśli n jest 46nigdy się nie skończy:

### 1
### 2
### 3
### 4
### 5
### 6
...
### 245684
### 245685
### 245686
### 245687
### 245688
### 245689
### 245690
### 245691
...

Dlaczego to takie dziwne?

PS: moja wersja Scala to 2.11.7

Odpowiedzi:

3 dla odpowiedzi № 1

45-tym wpisem w wyniku płaskiej mapy jest (9,9). Jest to ostatnia krotka, którą można wygenerować z liczby i <10. Aby wygenerować 46 krotkę, kod próbuje następnie i = 10, ale Stream.from(i).takeWhile(_ < 10) nie zwraca poprawnych krotek, więc kod natychmiast przechodzi do i = 11 i tak dalej, podając drukowane linie, które widzisz, ale nigdy nie generuje nowego elementu dla strumienia ...