[scala] Stream 의 concat은 #::이다.
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)