zio/zio1
피보나치(fibonacci) 수열을 Scala Stream, ZStream 으로 각각 구현
wefree
2021. 8. 3. 00:47
문제
피보나치(fibonacci) 수열 앞 10개를 출력하는 프로그램을 아래 2가지 방법으로 각각 구현하라
- scala stream 을 이용해 구현
- ZStream 을 이용해 구현
코드
scala stream 을 이용한 구현
object ScalaStreamFibo {
def main(args: Array[String]): Unit = {
def fibonacci(h: Long, n: Long): Stream[Long] = h #:: fibonacci(n, h + n)
fibonacci(0, 1).take(10).foreach(println)
}
}
ZStream 을 이용한 구현
import zio._
import zio.stream.ZStream
object ZStreamFibo extends App {
val fibonacci: ZStream[Any, Nothing, Long] = ZStream.unfold((0, 1)) {
case (h, n) => Option(h, (n, h + n))
}
override def run(args: List[String]): URIO[zio.ZEnv, ExitCode] =
fibonacci.take(10).foreach(x => console.putStrLn(x.toString)).exitCode
}
설명
scala stream 을 이용한 구현은 Martin Odersky 의 'Programming in Scala' 에도 나와있다. 이런 재귀를 생각해 구현하기는 매우 어렵다. 이에 비해 zio 의 ZStream 을 이용한 구현은 State 를 활용해 이해하기가 훨씬 쉬운것 같다.