scala에서 Stream은 lazy하게 계산되는 리스트이다. 


Stream에서 concat을 하려면 :: 이 아니라 #::을 사용한다. 



scala> val stream = 1 #:: 2 #:: 3 #:: Stream.empty

stream: scala.collection.immutable.Stream[Int] = Stream(1, ?)



실행 예제이다.


scala> def fibFrom(a: Int, b: Int): Stream[Int]  = a #:: fibFrom(b, a + b)

fibFrom: (a: Int, b: Int)Stream[Int]



여기서 엄청 큰 수를 넣어도 Stream(1, ?로 나타난다. 


scala> val fibs = fibFrom(1, 1).take(3)

fibs: scala.collection.immutable.Stream[Int] = Stream(1, ?)


scala> fibs.toList

res0: List[Int] = List(1, 1, 2)



또 다른 예제이다.'

scala> def from(n: Int): Stream[Int] = n #:: from(n+1)

from: (n: Int)Stream[Int]


scala>  val nats = from(0)

nats: Stream[Int] = Stream(0, ?)


scala>     val m4s = nats map (_ * 4)

m4s: scala.collection.immutable.Stream[Int] = Stream(0, ?)





실제 m4s에 매개 변수가 길더라도 lazy라서 아직 계산되지 않았다.


scala> m4s take 10000000

res2: scala.collection.immutable.Stream[Int] = Stream(0, ?)



실제 수행되는 시점에 toList를 호출한다.


scala> (m4s take 10000000).toList.drop(3)




Posted by '김용환'
,