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)
'scala' 카테고리의 다른 글
[scala] 변수를 사용하기 위한 underscore (0) | 2017.07.05 |
---|---|
[scala] Church Rosser 이론 (Lambda calculus)에 대한 링크 펌질 (0) | 2017.07.04 |
[scala] forall, for 예제 코드 (0) | 2017.06.30 |
[scala] forall 표현식 (0) | 2017.06.30 |
[scala] filter류 예제 - filter, filterNot, partition, takeWhile, dropWhile (0) | 2017.06.30 |